home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / etc / bash_completion < prev    next >
Text File  |  2008-06-19  |  217KB  |  9,406 lines

  1. #   bash_completion - programmable completion functions for bash 3.x
  2. #              (backwards compatible with bash 2.05b)
  3. #
  4. #   $Id: bash_completion,v 1.872 2006/03/01 16:20:18 ianmacd Exp $
  5. #
  6. #   Copyright (C) Ian Macdonald <ian@caliban.org>
  7. #
  8. #   This program is free software; you can redistribute it and/or modify
  9. #   it under the terms of the GNU General Public License as published by
  10. #   the Free Software Foundation; either version 2, or (at your option)
  11. #   any later version.
  12. #
  13. #   This program is distributed in the hope that it will be useful,
  14. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. #   GNU General Public License for more details.
  17. #
  18. #   You should have received a copy of the GNU General Public License
  19. #   along with this program; if not, write to the Free Software Foundation,
  20. #   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. #
  22. #   The latest version of this software can be obtained here:
  23. #
  24. #   http://www.caliban.org/bash/index.shtml#completion
  25. #
  26. #   RELEASE: 20060301
  27.  
  28. if [[ $- == *v* ]]; then
  29.     BASH_COMPLETION_ORIGINAL_V_VALUE="-v"
  30. else
  31.     BASH_COMPLETION_ORIGINAL_V_VALUE="+v"
  32. fi
  33.  
  34. if [[ -n $BASH_COMPLETION_DEBUG ]]; then
  35.     set -v
  36. else
  37.     set +v
  38. fi
  39.  
  40. # Alter the following to reflect the location of this file.
  41. #
  42. [ -n "$BASH_COMPLETION" ] || BASH_COMPLETION=/etc/bash_completion
  43. [ -n "$BASH_COMPLETION_DIR" ] || BASH_COMPLETION_DIR=/etc/bash_completion.d
  44. readonly BASH_COMPLETION BASH_COMPLETION_DIR
  45.  
  46. # Set a couple of useful vars
  47. #
  48. UNAME=$( uname -s )
  49. # strip OS type and version under Cygwin (e.g. CYGWIN_NT-5.1 => Cygwin)
  50. UNAME=${UNAME/CYGWIN_*/Cygwin}
  51. RELEASE=$( uname -r )
  52.  
  53. # features supported by bash 2.05 and higher
  54. if [ ${BASH_VERSINFO[0]} -eq 2 ] && [[ ${BASH_VERSINFO[1]} > 04 ]] ||
  55.    [ ${BASH_VERSINFO[0]} -gt 2 ]; then
  56.     declare -r bash205=$BASH_VERSION 2>/dev/null || :
  57.     default="-o default"
  58.     dirnames="-o dirnames"
  59.     filenames="-o filenames"
  60. fi
  61. # features supported by bash 2.05b and higher
  62. if [ ${BASH_VERSINFO[0]} -eq 2 ] && [[ ${BASH_VERSINFO[1]} = "05b" ]] ||
  63.    [ ${BASH_VERSINFO[0]} -gt 2 ]; then
  64.     declare -r bash205b=$BASH_VERSION 2>/dev/null || :
  65.     nospace="-o nospace"
  66. fi
  67. # features supported by bash 3.0 and higher
  68. if [ ${BASH_VERSINFO[0]} -gt 2 ]; then
  69.     declare -r bash3=$BASH_VERSION 2>/dev/null || :
  70.     bashdefault="-o bashdefault"
  71.     plusdirs="-o plusdirs"
  72. fi
  73.  
  74. # Turn on extended globbing and programmable completion
  75. shopt -s extglob progcomp
  76.  
  77. # A lot of the following one-liners were taken directly from the
  78. # completion examples provided with the bash 2.04 source distribution
  79.  
  80. # Make directory commands see only directories
  81. complete -d pushd
  82.  
  83. # The following section lists completions that are redefined later
  84. # Do NOT break these over multiple lines.
  85. #
  86. # START exclude -- do NOT remove this line
  87. complete -f -X '!*.?(t)bz?(2)' bunzip2 bzcat bzcmp bzdiff bzegrep bzfgrep bzgrep
  88. complete -f -X '!*.@(zip|ZIP|jar|JAR|exe|EXE|pk3|war|wsz|ear|zargo|xpi|sxw|ott)' unzip zipinfo
  89. complete -f -X '*.Z' compress znew
  90. complete -f -X '!*.@(Z|gz|tgz|Gz|dz)' gunzip zcmp zdiff zcat zegrep zfgrep zgrep zless zmore
  91. complete -f -X '!*.Z' uncompress
  92. complete -f -X '!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX)' ee display
  93. complete -f -X '!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|GIF|JPG|JP?(E)G|TIF?(F)|PNG|P[BGP]M|BMP|X[BP]M|RLE|RGB|PCX|FITS|PM)' xv qiv
  94. complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview
  95. complete -f -X '!*.@(dvi|DVI)?(.@(gz|Z|bz2))' xdvi
  96. complete -f -X '!*.@(dvi|DVI)?(.@(gz|bz2))' kdvi
  97. complete -f -X '!*.@(dvi|DVI)' dvips dviselect dvitype dvipdf advi dvipdfm dvipdfmx
  98. complete -f -X '!*.@(pdf|PDF)' acroread gpdf xpdf
  99. complete -f -X '!*.@(?(e)ps|?(E)PS|pdf|PDF)' kpdf
  100. complete -f -X '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ)|cb(r|z)|CB(R|Z)|djv?(u)|DJV?(U)||dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX)' evince
  101. complete -f -X '!*.@(?(e)ps|?(E)PS)' ps2pdf
  102. complete -f -X '!*.texi*' makeinfo texi2html
  103. complete -f -X '!*.@(?(la)tex|?(LA)TEX|texi|TEXI|dtx|DTX|ins|INS)' tex latex slitex jadetex pdfjadetex pdftex pdflatex texi2dvi
  104. complete -f -X '!*.@(mp3|MP3)' mpg123 mpg321 madplay
  105. complete -f -X '!*.@(mp?(e)g|MP?(E)G|wma|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|viv|rm|ram|yuv|mov|MOV|qt|QT|wmv|mp3|MP3|m4p|M4P|m4v|M4V|ogg|OGG|ogm|OGM|mp4|MP4|wav|WAV|asx|ASX|mng|MNG|srt)' xine aaxine fbxine kaffeine
  106. complete -f -X '!*.@(avi|asf|wmv)' aviplay
  107. complete -f -X '!*.@(rm?(j)|ra?(m)|smi?(l))' realplay
  108. complete -f -X '!*.@(mpg|mpeg|avi|mov|qt)' xanim
  109. complete -f -X '!*.@(ogg|OGG|m3u|flac|spx)' ogg123
  110. complete -f -X '!*.@(mp3|MP3|ogg|OGG|pls|m3u)' gqmpeg freeamp
  111. complete -f -X '!*.fig' xfig
  112. complete -f -X '!*.@(mid?(i)|MID?(I))' playmidi
  113. complete -f -X '!*.@(mid?(i)|MID?(I)|rmi|RMI|rcp|RCP|[gr]36|[GR]36|g18|G18|mod|MOD|xm|XM|it|IT|x3m|X3M)' timidity
  114. complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview
  115. complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' emacs
  116. complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine
  117. complete -f -X '!*.@(zip|ZIP|z|Z|gz|GZ|tgz|TGZ)' bzme
  118. complete -f -X '!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))' netscape mozilla lynx opera galeon curl dillo elinks amaya
  119. complete -f -X '!*.@(sxw|stw|sxg|sgl|doc|dot|rtf|txt|htm|html|odt|ott|odm)' oowriter
  120. complete -f -X '!*.@(sxi|sti|pps|ppt|pot|odp|otp)' ooimpress
  121. complete -f -X '!*.@(sxc|stc|xls|xlw|xlt|csv|ods|ots)' oocalc
  122. complete -f -X '!*.@(sxd|std|sda|sdd|odg|otg)' oodraw
  123. complete -f -X '!*.@(sxm|smf|mml|odf)' oomath
  124. complete -f -X '!*.odb' oobase
  125. complete -f -X '!*.rpm' rpm2cpio
  126. # FINISH exclude -- do not remove this line
  127.  
  128. # start of section containing compspecs that can be handled within bash
  129.  
  130. # user commands see only users
  131. complete -u su usermod userdel passwd chage write chfn groups slay w sux
  132.  
  133. # group commands see only groups
  134. [ -n "$bash205" ] && complete -g groupmod groupdel newgrp 2>/dev/null
  135.  
  136. # bg completes with stopped jobs
  137. complete -A stopped -P '%' bg
  138.  
  139. # other job commands
  140. complete -j -P '%' fg jobs disown
  141.  
  142. # readonly and unset complete with shell variables
  143. complete -v readonly unset
  144.  
  145. # set completes with set options
  146. complete -A setopt set
  147.  
  148. # shopt completes with shopt options
  149. complete -A shopt shopt
  150.  
  151. # helptopics
  152. complete -A helptopic help
  153.  
  154. # unalias completes with aliases
  155. complete -a unalias
  156.  
  157. # bind completes with readline bindings (make this more intelligent)
  158. complete -A binding bind
  159.  
  160. # type and which complete on commands
  161. complete -c command type which
  162.  
  163. # builtin completes on builtins
  164. complete -b builtin
  165.  
  166. # start of section containing completion functions called by other functions
  167.  
  168. # This function checks whether we have a given program on the system.
  169. # No need for bulky functions in memory if we don't.
  170. #
  171. have()
  172. {
  173.     unset -v have
  174.     PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
  175.         have="yes"
  176. }
  177.  
  178. # use GNU sed if we have it, since its extensions are still used in our code
  179. #
  180. [ $UNAME != Linux ] && have gsed && alias sed=gsed
  181.  
  182. # This function checks whether a given readline variable
  183. # is `on'.
  184. #
  185. _rl_enabled() 
  186. {
  187.     [[ "$( bind -v )" = *$1+([[:space:]])on* ]]
  188. }
  189.  
  190. # This function shell-quotes the argument
  191. quote()
  192. {
  193.     echo \'${1//\'/\'\\\'\'}\' #'# Help vim syntax highlighting
  194. }
  195.  
  196. # This function quotes the argument in a way so that readline dequoting
  197. # results in the original argument
  198. quote_readline()
  199. {
  200.     local t="${1//\\/\\\\}"
  201.     echo \'${t//\'/\'\\\'\'}\' #'# Help vim syntax highlighting
  202. }
  203.  
  204. # This function shell-dequotes the argument
  205. dequote()
  206. {
  207.     eval echo "$1"
  208. }
  209.  
  210.  
  211. # Get the word to complete
  212. # This is nicer than ${COMP_WORDS[$COMP_CWORD]}, since it handles cases
  213. # where the user is completing in the middle of a word.
  214. # (For example, if the line is "ls foobar",
  215. # and the cursor is here -------->   ^
  216. # it will complete just "foo", not "foobar", which is what the user wants.)
  217. #
  218. # Accepts an optional parameter indicating which characters out of
  219. # $COMP_WORDBREAKS should NOT be considered word breaks. This is useful
  220. # for things like scp where we want to return host:path and not only path.
  221. _get_cword()
  222. {
  223.     if [[ "${#COMP_WORDS[COMP_CWORD]}" -eq 0 ]] || [[ "$COMP_POINT" == "${#COMP_LINE}" ]]; then
  224.         echo "${COMP_WORDS[COMP_CWORD]}"
  225.     else
  226.         local i
  227.         local cur="$COMP_LINE"
  228.         local index="$COMP_POINT"
  229.         for (( i = 0; i <= COMP_CWORD; ++i )); do
  230.             while [[ "${#cur}" -ge ${#COMP_WORDS[i]} ]] && [[ "${cur:0:${#COMP_WORDS[i]}}" != "${COMP_WORDS[i]}" ]]; do
  231.                 cur="${cur:1}"
  232.                 index="$(( index - 1 ))"
  233.             done
  234.             if [[ "$i" -lt "$COMP_CWORD" ]]; then
  235.                 local old_size="${#cur}"
  236.                 cur="${cur#${COMP_WORDS[i]}}"
  237.                 local new_size="${#cur}"
  238.                 index="$(( index - old_size + new_size ))"
  239.             fi
  240.         done
  241.  
  242.         if [[ "${COMP_WORDS[COMP_CWORD]:0:${#cur}}" != "$cur" ]]; then
  243.             # We messed up! At least return the whole word so things keep working
  244.             echo "${COMP_WORDS[COMP_CWORD]}"
  245.         else
  246.             echo "${cur:0:$index}"
  247.         fi
  248.     fi
  249. }
  250.  
  251.  
  252. # This function performs file and directory completion. It's better than
  253. # simply using 'compgen -f', because it honours spaces in filenames.
  254. # If passed -d, it completes only on directories. If passed anything else,
  255. # it's assumed to be a file glob to complete on.
  256. #
  257. _filedir()
  258. {
  259.     local IFS=$'\t\n' xspec
  260.  
  261.     _expand || return 0
  262.  
  263.     local toks=( ) tmp
  264.     while read -r tmp; do
  265.         [[ -n $tmp ]] && toks[${#toks[@]}]=$tmp
  266.     done < <( compgen -d -- "$(quote_readline "$cur")" )
  267.  
  268.     if [[ "$1" != -d ]]; then
  269.         xspec=${1:+"!*.$1"}
  270.         while read -r tmp; do
  271.             [[ -n $tmp ]] && toks[${#toks[@]}]=$tmp
  272.         done < <( compgen -f -X "$xspec" -- "$(quote_readline "$cur")" )
  273.     fi
  274.  
  275.     COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
  276. }
  277.  
  278. # This function completes on signal names
  279. #
  280. _signals()
  281. {
  282.     local i
  283.  
  284.     # standard signal completion is rather braindead, so we need
  285.     # to hack around to get what we want here, which is to
  286.     # complete on a dash, followed by the signal name minus
  287.     # the SIG prefix
  288.     COMPREPLY=( $( compgen -A signal SIG${cur#-} ))
  289.     for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do
  290.         COMPREPLY[i]=-${COMPREPLY[i]#SIG}
  291.     done
  292. }
  293.  
  294. # This function completes on configured network interfaces
  295. #
  296. _configured_interfaces()
  297. {
  298.     if [ -f /etc/debian_version ]; then
  299.         # Debian system
  300.         COMPREPLY=( $( sed -ne 's|^iface \([^ ]\+\).*$|\1|p' \
  301.                    /etc/network/interfaces ) )
  302.     elif [ -f /etc/SuSE-release ]; then
  303.         # SuSE system
  304.         COMPREPLY=( $( command ls \
  305.             /etc/sysconfig/network/ifcfg-* | \
  306.             sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) )
  307.     elif [ -f /etc/pld-release ]; then
  308.         # PLD Linux
  309.         COMPREPLY=( $( command ls -B \
  310.             /etc/sysconfig/interfaces | \
  311.             sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) )
  312.     else
  313.         # Assume Red Hat
  314.         COMPREPLY=( $( command ls \
  315.             /etc/sysconfig/network-scripts/ifcfg-* | \
  316.             sed -ne 's|.*ifcfg-\('$cur'.*\)|\1|p' ) )
  317.     fi
  318. }
  319.  
  320. # This function completes on all available network interfaces
  321. # -a: restrict to active interfaces only
  322. # -w: restrict to wireless interfaces only
  323. #
  324. _available_interfaces()
  325. {
  326.     local cmd
  327.  
  328.     if [ "${1:-}" = -w ]; then
  329.         cmd="iwconfig"
  330.     elif [ "${1:-}" = -a ]; then
  331.         cmd="ifconfig"
  332.     else
  333.         cmd="ifconfig -a"
  334.     fi
  335.  
  336.     COMPREPLY=( $( eval $cmd 2>/dev/null | \
  337.         sed -ne 's|^\('$cur'[^[:space:][:punct:]]\{1,\}\).*$|\1|p') )
  338. }
  339.  
  340. # This function expands tildes in pathnames
  341. #
  342. _expand()
  343. {
  344.     # FIXME: Why was this here?
  345.     # [ "$cur" != "${cur%\\}" ] && cur="$cur\\"
  346.  
  347.     # expand ~username type directory specifications
  348.     if [[ "$cur" == \~*/* ]]; then
  349.         eval cur=$cur
  350.     elif [[ "$cur" == \~* ]]; then
  351.         cur=${cur#\~}
  352.         COMPREPLY=( $( compgen -P '~' -u $cur ) )
  353.         return ${#COMPREPLY[@]}
  354.     fi
  355. }
  356.  
  357. # This function completes on process IDs.
  358. # AIX and Solaris ps prefers X/Open syntax.
  359. [ $UNAME = SunOS -o $UNAME = AIX ] &&
  360. _pids()
  361. {
  362.     COMPREPLY=( $( compgen -W '$( command ps -efo pid | sed 1d )' -- $cur ))
  363. } ||
  364. _pids()
  365. {
  366.     COMPREPLY=( $( compgen -W '$( command ps axo pid | sed 1d )' -- $cur ) )
  367. }
  368.  
  369. # This function completes on process group IDs.
  370. # AIX and SunOS prefer X/Open, all else should be BSD.
  371. [ $UNAME = SunOS -o $UNAME = AIX ] &&
  372. _pgids()
  373. {
  374.     COMPREPLY=( $( compgen -W '$( command ps -efo pgid | sed 1d )' -- $cur ))
  375. } ||
  376. _pgids()
  377. {
  378.     COMPREPLY=( $( compgen -W '$( command ps axo pgid | sed 1d )' -- $cur ))
  379. }
  380.  
  381. # This function completes on user IDs
  382. #
  383. _uids()
  384. {
  385.     if type getent &>/dev/null; then
  386.         COMPREPLY=( $( getent passwd | \
  387.                 awk -F: '{if ($3 ~ /^'$cur'/) print $3}' ) )
  388.     elif type perl &>/dev/null; then
  389.         COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"' )' -- $cur ) )
  390.     else
  391.         # make do with /etc/passwd
  392.         COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($3 ~ /^'$cur'/) print $3}'\
  393.                 /etc/passwd ) )
  394.     fi
  395. }
  396.  
  397. # This function completes on group IDs
  398. #
  399. _gids()
  400. {
  401.     if type getent &>/dev/null; then
  402.         COMPREPLY=( $( getent group | \
  403.                 awk -F: '{if ($3 ~ /^'$cur'/) print $3}' ) )
  404.     elif type perl &>/dev/null; then
  405.         COMPREPLY=( $( compgen -W '$( perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"' )' -- $cur ) )
  406.     else
  407.         # make do with /etc/group
  408.         COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($3 ~ /^'$cur'/) print $3}'\
  409.                 /etc/group ) )
  410.     fi
  411. }
  412.  
  413. # This function completes on services
  414. #
  415. _services()
  416. {
  417.     local sysvdir famdir
  418.     [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d || sysvdir=/etc/init.d
  419.     famdir=/etc/xinetd.d
  420.     COMPREPLY=( $( builtin echo $sysvdir/!(*.rpmsave|*.rpmorig|*~|functions)) )
  421.  
  422.     if [ -d $famdir ]; then
  423.         COMPREPLY=( "${COMPREPLY[@]}" $( builtin echo $famdir/!(*.rpmsave|*.rpmorig|*~)) )
  424.     fi
  425.  
  426.     COMPREPLY=( $( compgen -W '${COMPREPLY[@]#@($sysvdir|$famdir)/}' -- $cur ) )
  427. }
  428.  
  429. # This function complete on modules
  430. #
  431. _modules()
  432. {
  433.     local modpath
  434.     modpath=/lib/modules/$1
  435.     COMPREPLY=( $( command ls -R $modpath | \
  436.             sed -ne 's/^\('$cur'.*\)\.k\?o\(\|.gz\)$/\1/p') )
  437. }
  438.  
  439. # this function complete on user:group format
  440. #
  441. _usergroup()
  442. {
  443.     local IFS=$'\n'
  444.     cur=${cur//\\\\ / }
  445.     if [[ $cur = *@(\\:|.)* ]] && [ -n "$bash205" ]; then
  446.         user=${cur%%*([^:.])}
  447.         COMPREPLY=( $(compgen -P ${user/\\\\} -g -- ${cur##*[.:]}) )
  448.     elif [[ $cur = *:* ]] && [ -n "$bash205" ]; then
  449.         COMPREPLY=( $( compgen -g -- ${cur##*[.:]} ) )
  450.     else
  451.         COMPREPLY=( $( compgen -S : -u -- $cur ) )
  452.     fi
  453. }
  454.  
  455. # this function count the number of mandatory args
  456. #
  457. _count_args()
  458. {
  459.     args=1
  460.     for (( i=1; i < COMP_CWORD; i++ )); do
  461.         if [[ "${COMP_WORDS[i]}" != -* ]]; then
  462.             args=$(($args+1))
  463.         fi
  464.     done
  465. }
  466.  
  467. # start of section containing completion functions for bash built-ins
  468.  
  469. # bash alias completion
  470. #
  471. _alias()
  472. {
  473.     local cur
  474.  
  475.     COMPREPLY=()
  476.     cur=${COMP_WORDS[$COMP_CWORD]}
  477.  
  478.     case "$COMP_LINE" in
  479.     *[^=])
  480.         COMPREPLY=( $( compgen -A alias -S '=' -- $cur ) )
  481.         ;;
  482.     *=)
  483.         COMPREPLY=( "$( alias ${cur%=} 2>/dev/null | \
  484.                  sed -e 's|^alias '$cur'\(.*\)$|\1|' )" )
  485.         ;;
  486.     esac
  487. }
  488. complete -F _alias $nospace alias
  489.  
  490. # bash export completion
  491. #
  492. _export()
  493. {
  494.     local cur
  495.  
  496.     COMPREPLY=()
  497.     cur=${COMP_WORDS[$COMP_CWORD]}
  498.  
  499.     case "$COMP_LINE" in
  500.     *=\$*)
  501.         COMPREPLY=( $( compgen -v -P '$' -- ${cur#*=\$} ) )
  502.         ;;
  503.     *[^=])
  504.         COMPREPLY=( $( compgen -v -S '=' -- $cur ) )
  505.         ;;
  506.     *=)
  507.         COMPREPLY=( "$( eval echo -n \"$`echo ${cur%=}`\" |
  508.             ( echo -n \'
  509.               sed -e 's/'\''/'\''\\\'\'''\''/g'
  510.               echo -n \' ) )" )
  511.         ;;
  512.     esac
  513. }
  514. complete -F _export $default $nospace export
  515.  
  516. # bash shell function completion
  517. #
  518. _function()
  519. {
  520.     local cur prev
  521.  
  522.     COMPREPLY=()
  523.     cur=`_get_cword`
  524.     prev=${COMP_WORDS[COMP_CWORD-1]}
  525.  
  526.     if [[ $1 == @(declare|typeset) ]]; then
  527.         if [ "$prev" = -f ]; then
  528.             COMPREPLY=( $( compgen -A function -- $cur ) )
  529.         elif [[ "$cur" == -* ]]; then
  530.             COMPREPLY=( $( compgen -W '-a -f -F -i -r -x -p' -- \
  531.                        $cur ) )
  532.         fi
  533.     elif [ $COMP_CWORD -eq 1 ]; then
  534.         COMPREPLY=( $( compgen -A function -- $cur ) )
  535.     else
  536.         COMPREPLY=( "() $( type -- ${COMP_WORDS[1]} | sed -e 1,2d )" )
  537.     fi
  538. }
  539. complete -F _function function declare typeset
  540.  
  541. # bash complete completion
  542. #
  543. _complete()
  544. {
  545.     local cur prev options
  546.  
  547.     COMPREPLY=()
  548.     cur=`_get_cword`
  549.     prev=${COMP_WORDS[COMP_CWORD-1]}
  550.  
  551.     case $prev in
  552.         -o)
  553.             options="default dirnames filenames"
  554.             [ -n "$bash205b" ] && options="$options nospace"
  555.             [ -n "$bash3" ] && options="$options bashdefault plusdirs"
  556.             COMPREPLY=( $( compgen -W "$options" -- $cur ) )
  557.             return 0
  558.             ;;
  559.  
  560.         -A)
  561.             COMPREPLY=( $( compgen -W 'alias arrayvar binding \
  562.                 builtin command directory disabled enabled \
  563.                 export file function group helptopic hostname \
  564.                 job keyword running service setopt shopt \
  565.                 signal stopped user variable' -- $cur ) )
  566.             return 0
  567.             ;;
  568.  
  569.         -C)
  570.             COMPREPLY=( $( compgen -A command -- $cur ) )
  571.             return 0
  572.             ;;
  573.         -F)
  574.             COMPREPLY=( $( compgen -A function -- $cur ) )
  575.             return 0
  576.             ;;
  577.         -@(p|r))
  578.             COMPREPLY=( $( complete -p | sed -e 's|.* ||' | \
  579.                     grep "^$cur" ) )
  580.             return 0
  581.             ;;
  582.  
  583.     esac
  584.  
  585.     if [[ "$cur" == -* ]]; then
  586.         # relevant options completion
  587.         options="-a -b -c -d -e -f -g -j -k -s -v -u -A -G -W -P -S -X -F -C"
  588.         [ -n "$bash205" ] && options="$options -o"
  589.         COMPREPLY=( $( compgen -W "$options" -- $cur ) )
  590.     else
  591.         COMPREPLY=( $( compgen -A command -- $cur ) )
  592.     fi
  593. }
  594. complete -F _complete complete
  595.  
  596. # start of section containing completion functions for external programs
  597.  
  598. # a little help for FreeBSD ports users
  599. [ $UNAME = FreeBSD ] && complete -W 'index search fetch fetch-list \
  600.     extract patch configure build install reinstall \
  601.     deinstall clean clean-depends kernel buildworld' make
  602.  
  603. # This completes on a list of all available service scripts for the
  604. # 'service' command and/or the SysV init.d directory, followed by
  605. # that script's available commands
  606. #
  607. { have service || [ -d /etc/init.d/ ]; } &&
  608. _service()
  609. {
  610.     local cur sysvdir
  611.  
  612.     COMPREPLY=()
  613.     prev=${COMP_WORDS[COMP_CWORD-1]}
  614.     cur=`_get_cword`
  615.  
  616.     # don't complete for things like killall, ssh and mysql if it's
  617.     # the standalone command, rather than the init script
  618.     [[ ${COMP_WORDS[0]} != @(*init.d/!(functions|~)|service) ]] && return 0
  619.  
  620.     # don't complete past 2nd token
  621.     [ $COMP_CWORD -gt 2 ] && return 0
  622.  
  623.     [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \
  624.                 || sysvdir=/etc/init.d
  625.  
  626.     if [[ $COMP_CWORD -eq 1 ]] && [[ $prev == "service" ]]; then
  627.         _services
  628.     else
  629.         COMPREPLY=( $( compgen -W '`sed -ne "y/|/ /; \
  630.                 s/^.*Usage.*{\(.*\)}.*$/\1/p" \
  631.                 $sysvdir/${prev##*/} 2>/dev/null`' -- $cur ) )
  632.     fi
  633.  
  634.     return 0
  635. } &&
  636. complete -F _service service
  637. [ -d /etc/init.d/ ] && complete -F _service $default \
  638.     $(for i in /etc/init.d/*; do echo ${i##*/}; done)
  639.  
  640. # chown(1) completion
  641. #
  642. _chown()
  643. {
  644.     local cur
  645.     cur=`_get_cword`
  646.  
  647.     # options completion
  648.     if [[ "$cur" == -* ]]; then
  649.         COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \
  650.         --dereference --no-dereference --from= --silent --quiet \
  651.         --reference= --recursive --verbose --help --version' -- $cur ) )
  652.     else
  653.         _count_args
  654.  
  655.         case $args in
  656.             1)
  657.                 _usergroup
  658.                 ;;
  659.             *)
  660.                 _filedir
  661.                 ;;
  662.         esac
  663.     fi
  664. }
  665. complete -F _chown $filenames chown
  666.  
  667. # chgrp(1) completion
  668. #
  669. _chgrp()
  670. {
  671.     local cur prev
  672.  
  673.     COMPREPLY=()
  674.     cur=`_get_cword`
  675.     cur=${cur//\\\\/}
  676.     prev=${COMP_WORDS[COMP_CWORD-1]}
  677.  
  678.     # options completion
  679.     if [[ "$cur" == -* ]]; then
  680.         COMPREPLY=( $( compgen -W '-c -h -f -R -v --changes \
  681.         --dereference --no-dereference --silent --quiet \
  682.         --reference= --recursive --verbose --help --version' -- $cur ) )
  683.         return 0
  684.     fi
  685.  
  686.     # first parameter on line or first since an option?
  687.     if [ $COMP_CWORD -eq 1 ] && [[ "$cur" != -* ]] || \
  688.        [[ "$prev" == -* ]] && [ -n "$bash205" ]; then
  689.         local IFS=$'\n'
  690.         COMPREPLY=( $( compgen -g $cur 2>/dev/null ) )
  691.     else
  692.         _filedir || return 0
  693.     fi
  694.  
  695.     return 0
  696. }
  697. complete -F _chgrp $filenames chgrp
  698.  
  699. # umount(8) completion. This relies on the mount point being the third
  700. # space-delimited field in the output of mount(8)
  701. #
  702. _umount()
  703. {
  704.     local cur
  705.  
  706.     COMPREPLY=()
  707.     cur=`_get_cword`
  708.  
  709.     OLDIFS="$IFS"
  710.     IFS="\n"
  711.     COMPREPLY=( $( compgen -W '$( mount | cut -d" " -f 3 )' -- $cur ) )
  712.     IFS="$OLDIFS"
  713.  
  714.     return 0
  715. }
  716. complete -F _umount $dirnames umount
  717.  
  718. # mount(8) completion. This will pull a list of possible mounts out of
  719. # /etc/{,v}fstab, unless the word being completed contains a ':', which
  720. # would indicate the specification of an NFS server. In that case, we
  721. # query the server for a list of all available exports and complete on
  722. # that instead.
  723. #
  724. _mount()
  725. {       local cur i sm host
  726.  
  727.     COMPREPLY=()
  728.     cur=`_get_cword`
  729.     [[ "$cur" == \\ ]] && cur="/"
  730.  
  731.     for i in {,/usr}/{,s}bin/showmount; do [ -x $i ] && sm=$i && break; done
  732.  
  733.     if [ -n "$sm" ] && [[ "$cur" == *:* ]]; then
  734.         COMPREPLY=( $( $sm -e ${cur%%:*} | sed 1d | \
  735.                    grep ^${cur#*:} | awk '{print $1}' ) )
  736.     elif [[ "$cur" == //* ]]; then
  737.         host=${cur#//}
  738.         host=${host%%/*}
  739.         if [ -n "$host" ]; then
  740.             COMPREPLY=( $( compgen -W "$( echo $( smbclient -d 0 -NL $host 2>/dev/null|
  741.             sed -ne '/^['"$'\t '"']*Sharename/,/^$/p' |
  742.             sed -ne '3,$s|^[^A-Za-z]*\([^'"$'\t '"']*\).*$|//'$host'/\1|p' ) )" -- "$cur" ) )
  743.         fi
  744.     elif [ -r /etc/vfstab ]; then
  745.         # Solaris
  746.         COMPREPLY=( $( awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' \
  747.                 /etc/vfstab | grep "^$cur" ) )
  748.     elif [ ! -e /etc/fstab ]; then
  749.         # probably Cygwin
  750.         COMPREPLY=( $( mount | awk '! /^[ \t]*#/ {if ($3 ~ /\//) print $3}' \
  751.                  | grep "^$cur" ) )
  752.     else
  753.         # probably Linux
  754.         COMPREPLY=( $( awk '! /^[ \t]*#/ {if ($2 ~ /\//) print $2}' \
  755.                 /etc/fstab | grep "^$cur" ) )
  756.     fi
  757.  
  758.     return 0
  759. }
  760. complete -F _mount $default $filenames mount
  761.  
  762. # Linux rmmod(8) completion. This completes on a list of all currently
  763. # installed kernel modules.
  764. #
  765. have rmmod && {
  766. _rmmod()
  767. {
  768.     local cur
  769.  
  770.     COMPREPLY=()
  771.     cur=`_get_cword`
  772.  
  773.     COMPREPLY=( $( /sbin/lsmod | \
  774.           awk '{if (NR != 1 && $1 ~ /^'$cur'/) print $1}' 2>/dev/null ))
  775.     return 0
  776. }
  777. complete -F _rmmod rmmod
  778.  
  779. # Linux insmod(8), modprobe(8) and modinfo(8) completion. This completes on a
  780. # list of all available modules for the version of the kernel currently
  781. # running.
  782. #
  783. _insmod()
  784. {
  785.     local cur prev modpath
  786.  
  787.     COMPREPLY=()
  788.     cur=`_get_cword`
  789.     prev=${COMP_WORDS[COMP_CWORD-1]}
  790.  
  791.     # behave like lsmod for modprobe -r
  792.     if [ $1 = "modprobe" ] &&
  793.        [ "${COMP_WORDS[1]}" = "-r" ]; then
  794.         COMPREPLY=( $( /sbin/lsmod | \
  795.                 awk '{if (NR != 1 && $1 ~ /^'$cur'/) print $1}' ) )
  796.         return 0
  797.     fi
  798.  
  799.     # do filename completion if we're giving a path to a module
  800.     if [[ "$cur" == */* ]]; then
  801.         _filedir '@(?(k)o?(.gz))'
  802.         return 0
  803.     fi
  804.  
  805.     if [ $COMP_CWORD -gt 1 ] && 
  806.        [[ "${COMP_WORDS[COMP_CWORD-1]}" != -* ]]; then
  807.         # do module parameter completion
  808.         COMPREPLY=( $( /sbin/modinfo -p ${COMP_WORDS[1]} 2>/dev/null | \
  809.                awk '{if ($1 ~ /^parm:/ && $2 ~ /^'$cur'/) { print $2 } \
  810.             else if ($1 !~ /:/ && $1 ~ /^'$cur'/) { print $1 }}' ) )
  811.     else
  812.         _modules $(uname -r)
  813.     fi
  814.  
  815.     return 0
  816. }
  817. complete -F _insmod $filenames insmod modprobe modinfo
  818. }
  819.  
  820. # man(1) completion
  821. #
  822. [ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Darwin \
  823.   -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \
  824.   -o $UNAME = OpenBSD ] &&
  825. _man()
  826. {
  827.     local cur prev sect manpath UNAME
  828.  
  829.     COMPREPLY=()
  830.     cur=`_get_cword`
  831.     prev=${COMP_WORDS[COMP_CWORD-1]}
  832.  
  833.     _expand || return 0
  834.  
  835.     # default completion if parameter contains /
  836.     if [[ "$cur" == */* ]]; then
  837.         _filedir
  838.         return 0
  839.     fi
  840.  
  841.     UNAME=$( uname -s )
  842.     # strip OS type and version under Cygwin
  843.     UNAME=${UNAME/CYGWIN_*/Cygwin}
  844.     if [ $UNAME = GNU -o $UNAME = Linux -o $UNAME = FreeBSD \
  845.          -o $UNAME = Cygwin ]; then
  846.         manpath=$( manpath 2>/dev/null || command man --path )
  847.     else
  848.         manpath=$MANPATH
  849.     fi
  850.  
  851.     if [ -z "$manpath" ]; then
  852.         COMPREPLY=( $( compgen -c -- $cur ) )
  853.         return 0
  854.     fi
  855.  
  856.     # determine manual section to search
  857.     [[ "$prev" == [0-9ln] ]] && sect=$prev || sect='*'
  858.  
  859.     manpath=$manpath:
  860.     if [ -n "$cur" ]; then
  861.         manpath="${manpath//://*man$sect/$cur* } ${manpath//://*cat$sect/$cur* }"
  862.     else
  863.         manpath="${manpath//://*man$sect/ } ${manpath//://*cat$sect/ }"
  864.     fi
  865.         
  866.     # redirect stderr for when path doesn't exist
  867.     COMPREPLY=( $( eval command ls "$manpath" 2>/dev/null ) )
  868.     # weed out directory path names and paths to man pages
  869.     COMPREPLY=( ${COMPREPLY[@]##*/?(:)} )
  870.     # strip suffix from man pages
  871.     COMPREPLY=( ${COMPREPLY[@]%.@(gz|bz2)} )
  872.     COMPREPLY=( $( compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}" ) )
  873.  
  874.     [[ "$prev" != [0-9ln] ]] && _filedir '[0-9ln]'
  875.  
  876.     return 0
  877. }
  878. [ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Darwin \
  879.   -o $UNAME = FreeBSD -o $UNAME = SunOS -o $UNAME = Cygwin \
  880.   -o $UNAME = OpenBSD ] && \
  881. complete -F _man $filenames man apropos whatis
  882.  
  883. # renice(8) completion
  884. #
  885. _renice()
  886. {
  887.     local command cur curopt i
  888.  
  889.     COMPREPLY=()
  890.     cur=`_get_cword`
  891.     command=$1
  892.  
  893.     i=0
  894.     # walk back through command line and find last option
  895.     while [ $i -le $COMP_CWORD -a ${#COMPREPLY[@]} -eq 0 ]; do
  896.         curopt=${COMP_WORDS[COMP_CWORD-$i]}
  897.         case "$curopt" in
  898.         -u)
  899.             COMPREPLY=( $( compgen -u -- $cur ) )
  900.             ;;
  901.         -g)
  902.             _pgids
  903.             ;;
  904.         -p|$command)
  905.             _pids
  906.             ;;
  907.         esac
  908.         i=$(( ++i ))
  909.     done
  910. }
  911. complete -F _renice renice
  912.  
  913. # kill(1) completion
  914. #
  915. _kill()
  916. {
  917.     local cur
  918.  
  919.     COMPREPLY=()
  920.     cur=`_get_cword`
  921.  
  922.     if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
  923.         # return list of available signals
  924.         _signals
  925.     else
  926.         # return list of available PIDs
  927.         _pids
  928.     fi
  929. }
  930. complete -F _kill kill
  931.  
  932. # Linux and FreeBSD killall(1) completion.
  933. #
  934. [ $UNAME = Linux -o $UNAME = FreeBSD ] &&
  935. _killall()
  936. {
  937.     local cur
  938.  
  939.     COMPREPLY=()
  940.     cur=`_get_cword`
  941.  
  942.     if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
  943.         _signals
  944.     else
  945.         COMPREPLY=( $( compgen -W '$( command ps axo command | \
  946.                   sed -ne "1d; s/^\[\?\([^-][^] ]*\).*$/\1/p" | \
  947.                   sed -e "s/.*\///" )' -- $cur ) )
  948.     fi
  949.  
  950.     return 0
  951. }
  952. [ $UNAME = Linux -o $UNAME = FreeBSD ] && complete -F _killall killall pkill
  953.  
  954. # Linux and FreeBSD pgrep(1) completion.
  955. #
  956. [ $UNAME = Linux -o $UNAME = FreeBSD ] &&
  957. _pgrep()
  958. {
  959.     local cur
  960.  
  961.     COMPREPLY=()
  962.     cur=`_get_cword`
  963.  
  964.     COMPREPLY=( $( compgen -W '$( command ps axo command | \
  965.               sed -ne "1d; s/^\[\?\([^-][^] ]*\).*$/\1/p" | \
  966.               sed -e "s/.*\///" )' -- $cur ) )
  967.  
  968.     return 0
  969. }
  970. [ $UNAME = Linux -o $UNAME = FreeBSD ] && complete -F _pgrep pgrep
  971. # Linux pidof(8) completion.
  972. [ $UNAME = Linux ] && complete -F _pgrep pidof
  973.  
  974. # GNU find(1) completion. This makes heavy use of ksh style extended
  975. # globs and contains Linux specific code for completing the parameter
  976. # to the -fstype option.
  977. #
  978. _find()
  979. {
  980.     local cur prev i exprfound onlyonce
  981.  
  982.     COMPREPLY=()
  983.     cur=`_get_cword`
  984.     prev=${COMP_WORDS[COMP_CWORD-1]}
  985.  
  986.     case "$prev" in
  987.     -@(max|min)depth)
  988.         COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9' -- $cur ) )
  989.         return 0
  990.         ;;
  991.     -?(a|c)newer|-fls|-fprint?(0|f)|-?(i)?(l)name|-?(i)wholename)
  992.         _filedir
  993.         return 0
  994.         ;;
  995.     -fstype)
  996.         # this is highly non-portable
  997.         [ -e /proc/filesystems ] &&
  998.         COMPREPLY=( $( cut -d$'\t' -f 2 /proc/filesystems | \
  999.                 grep "^$cur" ) )
  1000.         return 0
  1001.         ;;
  1002.     -gid)
  1003.         _gids
  1004.         return 0
  1005.         ;;
  1006.     -group)
  1007.         if [ -n "$bash205" ]; then
  1008.             COMPREPLY=( $( compgen -g -- $cur 2>/dev/null) )
  1009.         fi
  1010.         return 0
  1011.         ;;
  1012.     -?(x)type)
  1013.         COMPREPLY=( $( compgen -W 'b c d p f l s' -- $cur ) )
  1014.         return 0
  1015.         ;;
  1016.     -uid)
  1017.         _uids
  1018.         return 0
  1019.         ;;
  1020.     -user)
  1021.         COMPREPLY=( $( compgen -u -- $cur ) )
  1022.         return 0
  1023.         ;;
  1024.     -exec|-ok)
  1025.         COMP_WORDS=(COMP_WORDS[0] $cur)
  1026.         COMP_CWORD=1
  1027.         _command
  1028.         return 0
  1029.         ;;
  1030.     -[acm]min|-[acm]time|-?(i)?(l)name|-inum|-?(i)path|-?(i)regex| \
  1031.     -links|-perm|-size|-used|-printf)
  1032.         # do nothing, just wait for a parameter to be given
  1033.         return 0
  1034.         ;;
  1035.     esac
  1036.  
  1037.     _expand || return 0
  1038.  
  1039.     # set exprfound to 1 if there is already an expression present
  1040.     for i in ${COMP_WORDS[@]}; do
  1041.         [[ "$i" = [-\(\),\!]* ]] && exprfound=1 && break
  1042.     done
  1043.  
  1044.     # handle case where first parameter is not a dash option
  1045.     if [ "$exprfound" != 1 ] && [[ "$cur" != [-\(\),\!]* ]]; then
  1046.         _filedir -d
  1047.         return 0
  1048.     fi
  1049.  
  1050.     # complete using basic options
  1051.     COMPREPLY=( $( compgen -W '-daystart -depth -follow -help -maxdepth \
  1052.             -mindepth -mount -noleaf -version -xdev -amin -anewer \
  1053.             -atime -cmin -cnewer -ctime -empty -false -fstype \
  1054.             -gid -group -ilname -iname -inum -ipath -iregex \
  1055.             -wholename \
  1056.             -links -lname -mmin -mtime -name -newer -nouser \
  1057.             -nogroup -perm -regex -size -true -type -uid -used \
  1058.             -user -xtype -exec -fls -fprint -fprint0 -fprintf -ok \
  1059.             -print -print0 -printf -prune -ls' -- $cur ) )
  1060.  
  1061.     # this removes any options from the list of completions that have
  1062.     # already been specified somewhere on the command line, as long as
  1063.     # these options can only be used once (in a word, "options", in
  1064.     # opposition to "tests" and "actions", as in the find(1) manpage).
  1065.     onlyonce=' -daystart -depth -follow -help -maxdepth -mindepth -mount \
  1066.            -noleaf -version -xdev '
  1067.     COMPREPLY=( $( echo "${COMP_WORDS[@]}" | \
  1068.                (while read -d ' ' i; do
  1069.                 [ "$i" == "" ] ||
  1070.                 [ "${onlyonce/ ${i%% *} / }" == "$onlyonce" ] &&
  1071.                 continue
  1072.                 # flatten array with spaces on either side,
  1073.                 # otherwise we cannot grep on word boundaries of
  1074.                 # first and last word
  1075.                 COMPREPLY=" ${COMPREPLY[@]} "
  1076.                 # remove word from list of completions
  1077.                 COMPREPLY=( ${COMPREPLY/ ${i%% *} / } )
  1078.             done
  1079.             echo "${COMPREPLY[@]}")
  1080.           ) )
  1081.     
  1082.     _filedir
  1083.     
  1084.     return 0
  1085. }
  1086. complete -F _find $filenames find
  1087.  
  1088. # Linux iwconfig(8) completion
  1089. #
  1090. [ $UNAME = Linux ] && have iwconfig &&
  1091. _iwconfig()
  1092. {
  1093.     local cur prev
  1094.  
  1095.     COMPREPLY=()
  1096.     cur=`_get_cword`
  1097.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1098.     
  1099.     case $prev in
  1100.         mode)
  1101.             COMPREPLY=( $( compgen -W 'managed ad-hoc master \
  1102.                 repeater secondary monitor' -- $cur ) )
  1103.             return 0
  1104.             ;;
  1105.         essid)
  1106.             COMPREPLY=( $( compgen -W 'on off any' -- $cur ) )
  1107.             if [ -n "${COMP_IWLIST_SCAN:-}" ]; then
  1108.                 COMPREPLY=( "${COMPREPLY[@]}" \
  1109.                     $( iwlist ${COMP_WORDS[1]} scan | \
  1110.                     awk -F '"' '/ESSID/ {print $2}' | \
  1111.                     grep "^$cur" ))
  1112.             fi
  1113.             return 0
  1114.             ;;
  1115.         nwid)
  1116.             COMPREPLY=( $( compgen -W 'on off' -- $cur ) )
  1117.             return 0
  1118.             ;;
  1119.         channel)
  1120.             COMPREPLY=( $( iwlist ${COMP_WORDS[1]} channel | \
  1121.                 awk '/^[[:space:]]*Channel/ {print $2}' | \
  1122.                 grep "^$cur" ) )
  1123.             return 0
  1124.             ;;
  1125.  
  1126.         freq)
  1127.             COMPREPLY=( $( iwlist ${COMP_WORDS[1]} channel | \
  1128.                 awk '/^[[:space:]]*Channel/ {print $4"G"}' | \
  1129.                 grep "^$cur" ) )
  1130.             return 0
  1131.             ;;
  1132.         ap)
  1133.             COMPREPLY=( $( compgen -W 'on off any' -- $cur ) )
  1134.             if [ -n "${COMP_IWLIST_SCAN:-}" ]; then
  1135.                 COMPREPLY=( "${COMPREPLY[@]}" \
  1136.                     $( iwlist ${COMP_WORDS[1]} scan | \
  1137.                     awk -F ': ' '/Address/ {print $2}' | \
  1138.                     grep "^$cur" ) )
  1139.             fi
  1140.             return 0
  1141.             ;;
  1142.         rate)
  1143.             COMPREPLY=( $( compgen -W 'auto fixed' -- $cur ) )
  1144.             COMPREPLY=( "${COMPREPLY[@]}" \
  1145.                 $( iwlist ${COMP_WORDS[1]} rate | \
  1146.                 awk '/^[[:space:]]*[0-9]/ {print $1"M"}' | \
  1147.                 grep "^$cur" ) )
  1148.             return 0
  1149.             ;;
  1150.         rts)
  1151.             COMPREPLY=( $( compgen -W 'auto fixed off' -- $cur ) )
  1152.             return 0
  1153.             ;;
  1154.         frag)
  1155.             COMPREPLY=( $( compgen -W 'auto fixed off' -- $cur ) )
  1156.             return 0
  1157.             ;;
  1158.         key)
  1159.             COMPREPLY=( $( compgen -W 'off on open restricted' -- $cur ) )
  1160.             return 0
  1161.             ;;
  1162.         enc)
  1163.             COMPREPLY=( $( compgen -W 'off on open restricted' -- $cur ) )
  1164.             return 0
  1165.             ;;
  1166.         power)
  1167.             COMPREPLY=( $( compgen -W 'period timeout off on' -- $cur ) )
  1168.             return 0
  1169.             ;;
  1170.         txpower)
  1171.             COMPREPLY=( $( compgen -W 'off on auto' -- $cur ) )
  1172.             return 0
  1173.             ;;
  1174.         retry)
  1175.             COMPREPLY=( $( compgen -W 'limit lifetime' -- $cur ) )
  1176.             return 0
  1177.             ;;
  1178.     esac
  1179.  
  1180.     if [ $COMP_CWORD -eq 1 ]; then
  1181.         if [[ "$cur" == -* ]]; then
  1182.             COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) 
  1183.         else
  1184.             _available_interfaces -w
  1185.         fi
  1186.     else
  1187.         COMPREPLY=( $( compgen -W 'essid nwid mode freq channel sens mode \
  1188.             ap nick rate rts frag enc key power txpower commit' -- $cur ) ) 
  1189.     fi
  1190.  
  1191. } &&
  1192. complete -F _iwconfig iwconfig
  1193.  
  1194. # Linux iwlist(8) completion
  1195. #
  1196. [ $UNAME = Linux ] && have iwlist &&
  1197. _iwlist()
  1198. {
  1199.     local cur prev
  1200.  
  1201.     COMPREPLY=()
  1202.     cur=`_get_cword`
  1203.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1204.     
  1205.     if [ $COMP_CWORD -eq 1 ]; then
  1206.         if [[ "$cur" == -* ]]; then
  1207.             COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) 
  1208.         else
  1209.             _available_interfaces -w
  1210.         fi
  1211.     else
  1212.         COMPREPLY=( $( compgen -W 'scan scanning freq frequency \
  1213.             channel rate bit bitrate key enc encryption power \
  1214.             txpower retry ap accesspoint peers event' -- $cur ) ) 
  1215.     fi
  1216. } &&
  1217. complete -F _iwlist iwlist
  1218.  
  1219. # Linux iwspy(8) completion
  1220. #
  1221. [ $UNAME = Linux ] && have iwspy &&
  1222. _iwspy()
  1223. {
  1224.     local cur
  1225.  
  1226.     COMPREPLY=()
  1227.     cur=`_get_cword`
  1228.  
  1229.     if [ $COMP_CWORD -eq 1 ]; then
  1230.         if [[ "$cur" == -* ]]; then
  1231.             COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) 
  1232.         else
  1233.             _available_interfaces -w
  1234.         fi
  1235.     else
  1236.         COMPREPLY=( $( compgen -W 'setthr getthr off' -- $cur ) ) 
  1237.     fi
  1238. } &&
  1239. complete -F _iwspy iwspy
  1240.  
  1241. # Linux iwpriv(8) completion
  1242. #
  1243. [ $UNAME = Linux ] && have iwpriv &&
  1244. _iwpriv()
  1245. {
  1246.     local cur prev
  1247.  
  1248.     COMPREPLY=()
  1249.     cur=`_get_cword`
  1250.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1251.  
  1252.     case "$prev" in
  1253.         roam)
  1254.             COMPREPLY=( $( compgen -W 'on off' -- $cur ) )
  1255.             return 0
  1256.             ;;
  1257.         port)
  1258.             COMPREPLY=( $( compgen -W 'ad-hoc managed' -- $cur ) )
  1259.             return 0
  1260.             ;;
  1261.     esac
  1262.  
  1263.     if [ $COMP_CWORD -eq 1 ]; then
  1264.         if [[ "$cur" == -* ]]; then
  1265.             COMPREPLY=( $( compgen -W '--help --version' -- $cur ) ) 
  1266.         else
  1267.             _available_interfaces -w
  1268.         fi
  1269.     else
  1270.         COMPREPLY=( $( compgen -W '--all roam port' -- $cur ) ) 
  1271.     fi
  1272. } &&
  1273. complete -F _iwpriv iwpriv
  1274.  
  1275. # RedHat & Debian GNU/Linux if{up,down} completion
  1276. #
  1277. [ $UNAME = Linux ] && { have ifup || have ifdown; } &&
  1278. _ifupdown()
  1279. {
  1280.     local cur
  1281.  
  1282.     COMPREPLY=()
  1283.     cur=`_get_cword`
  1284.  
  1285.     if [ $COMP_CWORD -eq 1 ]; then
  1286.         _configured_interfaces
  1287.         COMPREPLY=( $(compgen -W '${COMPREPLY[@]}' -- "$cur") )
  1288.        fi
  1289.  
  1290.        return 0
  1291. } &&
  1292. complete -F _ifupdown ifup ifdown
  1293. [ $UNAME = Linux ] && have ifstatus && complete -F _ifupdown ifstatus
  1294.  
  1295. # Linux ipsec(8) completion (for FreeS/WAN)
  1296. #
  1297. [ $UNAME = Linux ] && have ipsec &&
  1298. _ipsec()
  1299. {
  1300.     local cur
  1301.  
  1302.     COMPREPLY=()
  1303.     cur=`_get_cword`
  1304.  
  1305.     
  1306.     if [ $COMP_CWORD -eq 1 ]; then
  1307.         COMPREPLY=( $( compgen -W 'auto barf eroute klipsdebug look \
  1308.                        manual pluto ranbits rsasigkey \
  1309.                        setup showdefaults showhostkey spi \
  1310.                        spigrp tncfg whack' -- $cur ) )
  1311.         return 0
  1312.     fi
  1313.  
  1314.     case ${COMP_WORDS[1]} in
  1315.     auto)
  1316.         COMPREPLY=( $( compgen -W '--asynchronous --up --add --delete \
  1317.                        --replace --down --route --unroute \
  1318.                        --ready --status --rereadsecrets' \
  1319.                     -- $cur ) )
  1320.         ;;
  1321.     manual)
  1322.         COMPREPLY=( $( compgen -W '--up --down --route --unroute \
  1323.                        --union' -- $cur ) )
  1324.         ;;
  1325.     ranbits)
  1326.         COMPREPLY=( $( compgen -W '--quick --continuous --bytes' \
  1327.                       -- $cur ) )
  1328.         ;;
  1329.     setup)
  1330.         COMPREPLY=( $( compgen -W '--start --stop --restart' -- $cur ) )
  1331.         ;;
  1332.  
  1333.     *)
  1334.         ;;
  1335.     esac
  1336.  
  1337.     return 0
  1338. } &&
  1339. complete -F _ipsec ipsec
  1340.  
  1341. # Postfix completion.
  1342. #
  1343. have postfix && {
  1344. # postfix(1)
  1345. #
  1346. _postfix()
  1347. {
  1348.     local cur prev
  1349.  
  1350.     cur=`_get_cword`
  1351.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1352.  
  1353.     if [[ $cur == '-' ]]; then
  1354.         COMPREPLY=(-c -D -v)
  1355.         return 0
  1356.     fi
  1357.     if [[ $prev == '-c' ]]; then
  1358.         _filedir -d
  1359.         return 0
  1360.     fi
  1361.     if [[ $prev == '-D' ]]; then
  1362.         COMPREPLY=( $( compgen -W 'start' -- "`get_cword`" ) )
  1363.         return 0
  1364.     fi
  1365.     COMPREPLY=( $( compgen -W 'start stop reload abort flush check' -- \
  1366.         "`get_cword`" ) )
  1367. }
  1368. complete -F _postfix postfix
  1369.  
  1370. # postalias(1) and postmap(1)
  1371. #
  1372. _postmap()
  1373. {
  1374.     local cur prev len idx
  1375.  
  1376.     cur=`_get_cword`
  1377.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1378.  
  1379.     if [[ $cur == '-' ]]; then
  1380.         COMPREPLY=(-N -f -i -n -o -p -r -v -w -c -d -q)
  1381.         return 0
  1382.     fi
  1383.     if [[ $prev == '-c' ]]; then
  1384.         _filedir -d
  1385.         return 0
  1386.     fi
  1387.     if [[ $prev == -[dq] ]]; then
  1388.         return 0
  1389.     fi
  1390.  
  1391.     if [[ "$cur" == *:* ]]; then
  1392.                COMPREPLY=( $( compgen -f -- ${cur#*:} ) )
  1393.     else
  1394.         len=${#cur}
  1395.         idx=0
  1396.         for pval in $( /usr/sbin/postconf -m ); do
  1397.             if [[ "$cur" == "${pval:0:$len}" ]]; then
  1398.                 COMPREPLY[$idx]="$pval:"
  1399.                 idx=$(($idx+1))
  1400.             fi
  1401.         done
  1402.         if [[ $idx -eq 0 ]]; then
  1403.             COMPREPLY=( $( compgen -f -- "$cur" ) )
  1404.         fi
  1405.     fi
  1406.     return 0
  1407. }
  1408. complete -F _postmap postmap postalias
  1409.  
  1410. # postcat(1)
  1411. #
  1412. _postcat()
  1413. {
  1414.     local cur prev pval len idx qfile
  1415.  
  1416.     cur=`_get_cword`
  1417.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1418.  
  1419.     if [[ $cur == '-' ]]; then
  1420.         COMPREPLY=(-c -q -v)
  1421.         return 0
  1422.     fi
  1423.     if [[ $prev == '-c' ]]; then
  1424.         _filedir -d
  1425.         return 0
  1426.     fi
  1427.  
  1428.     qfile=0
  1429.     for idx in "${COMP_WORDS[@]}"; do
  1430.         [[ "$idx" = -q ]] && qfile=1 && break
  1431.     done
  1432.     if [[ $qfile == 1 ]]; then
  1433.         len=${#cur}
  1434.         idx=0
  1435.         for pval in $( mailq | \
  1436.             sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* !].*$//' ); do
  1437.             if [[ "$cur" == "${pval:0:$len}" ]]; then
  1438.                 COMPREPLY[$idx]=$pval
  1439.                 idx=$(($idx+1))
  1440.             fi
  1441.         done
  1442.         return 0
  1443.     else
  1444.         _filedir
  1445.         return 0
  1446.     fi
  1447. }
  1448. complete -F _postcat postcat
  1449.  
  1450. # postconf(1)
  1451. #
  1452. _postconf()
  1453. {
  1454.     local cur prev pval len idx eqext
  1455.  
  1456.     cur=`_get_cword`
  1457.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1458.     if [[ $cur == '-' ]]; then
  1459.         COMPREPLY=(-c -d -e -h -m -l -n -v)
  1460.         return 0
  1461.     fi
  1462.     if [[ $prev == '-c' ]]; then
  1463.         _filedir -d
  1464.         return 0
  1465.     fi
  1466.     if [[ $prev == '-e' ]]; then
  1467.         cur=${cur#[\"\']}
  1468.         eqext='='
  1469.     fi
  1470.     len=${#cur}
  1471.     idx=0
  1472.     for pval in $( /usr/sbin/postconf | cut -d ' ' -f 1 ); do
  1473.         if [[ "$cur" == "${pval:0:$len}" ]]; then
  1474.             COMPREPLY[$idx]="$pval$eqext"
  1475.             idx=$(($idx+1))
  1476.         fi
  1477.     done
  1478.     return 0
  1479. }
  1480. complete -F _postconf postconf
  1481.  
  1482. # postsuper(1)
  1483. #
  1484. _postsuper()
  1485. {
  1486.     local cur prev pval len idx
  1487.  
  1488.     cur=`_get_cword`
  1489.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1490.  
  1491.     if [[ $cur == '-' ]]; then
  1492.         COMPREPLY=(-c -d -h -H -p -r -s -v)
  1493.         return 0
  1494.     fi
  1495.     case $prev in
  1496.     -[dr])
  1497.         len=${#cur}
  1498.         idx=0
  1499.         for pval in $( echo ALL; mailq | \
  1500.             sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* !].*$//' ); do
  1501.             if [[ "$cur" == "${pval:0:$len}" ]]; then
  1502.                 COMPREPLY[$idx]=$pval
  1503.                 idx=$(($idx+1))
  1504.             fi
  1505.         done
  1506.         return 0
  1507.         ;;
  1508.     -h)
  1509.         len=${#cur}
  1510.         idx=0
  1511.         for pval in $( echo ALL; mailq | \
  1512.             sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; s/[* ].*$//; /!$/d' ); do
  1513.             if [[ "$cur" == "${pval:0:$len}" ]]; then
  1514.                 COMPREPLY[$idx]=$pval
  1515.                 idx=$(($idx+1))
  1516.             fi
  1517.         done
  1518.         return 0
  1519.         ;;
  1520.     -H)
  1521.         len=${#cur}
  1522.         idx=0
  1523.         for pval in $( echo ALL; mailq | \
  1524.             sed -e '1d; $d; /^[^0-9A-Z]\|^$/d; /^[0-9A-Z]*[* ]/d; s/!.*$//' ); do
  1525.             if [[ "$cur" == "${pval:0:$len}" ]]; then
  1526.                 COMPREPLY[$idx]=$pval
  1527.                 idx=$(($idx+1))
  1528.             fi
  1529.         done
  1530.         return 0
  1531.         ;;
  1532.     esac
  1533.     COMPREPLY=( $( compgen -W 'hold incoming active deferred' -- $cur ) )
  1534.     return 0
  1535. }
  1536. complete -F _postsuper postsuper
  1537. }
  1538.  
  1539. # cvs(1) completion
  1540. #
  1541. have cvs && {
  1542. set_prefix()
  1543. {
  1544.     [ -z ${prefix:-} ] || prefix=${cur%/*}/
  1545.     [ -r ${prefix:-}CVS/Entries ] || prefix=""
  1546. }
  1547.  
  1548. get_entries()
  1549. {
  1550.     local IFS=$'\n'
  1551.     [ -r ${prefix:-}CVS/Entries ] && \
  1552.     entries=$(cut -d/ -f2 -s ${prefix:-}CVS/Entries)
  1553. }
  1554.  
  1555. get_modules()
  1556. {
  1557.     if [ -n "$prefix" ]; then 
  1558.         COMPREPLY=( $( command ls -d ${cvsroot}/${prefix}/!(CVSROOT) ) )
  1559.     else
  1560.         COMPREPLY=( $( command ls -d ${cvsroot}/!(CVSROOT) ) )
  1561.     fi
  1562. }
  1563.  
  1564. _cvs()
  1565. {
  1566.     local cur count mode i cvsroot cvsroots pwd
  1567.     local -a flags miss files entries changed newremoved
  1568.  
  1569.     COMPREPLY=()
  1570.     cur=`_get_cword`
  1571.  
  1572.     count=0
  1573.     for i in "${COMP_WORDS[@]}"; do
  1574.         [ $count -eq $COMP_CWORD ] && break
  1575.         # Last parameter was the CVSROOT, now go back to mode selection
  1576.         if [ "${COMP_WORDS[((count))]}" == "$cvsroot" -a "$mode" == "cvsroot" ]; then
  1577.             mode=""
  1578.         fi
  1579.         if [ -z "$mode" ]; then
  1580.             case $i in
  1581.             -d)
  1582.                 mode=cvsroot
  1583.                 cvsroot=${COMP_WORDS[((count+1))]}
  1584.                 ;;
  1585.             @(ad?(d)|new))
  1586.                 mode=add
  1587.                 ;;
  1588.             @(adm?(in)|rcs))
  1589.                 mode=admin
  1590.                 ;;
  1591.             ann?(notate))
  1592.                 mode=annotate
  1593.                 ;;
  1594.             @(checkout|co|get))
  1595.                 mode=checkout
  1596.                 ;;
  1597.             @(com?(mit)|ci))
  1598.                 mode=commit
  1599.                 ;;
  1600.             di?(f?(f)))
  1601.                 mode=diff
  1602.                 ;;
  1603.             ex?(p?(ort)))
  1604.                 mode=export
  1605.                 ;;
  1606.             ?(un)edit)
  1607.                 mode=$i
  1608.                 ;;
  1609.             hi?(s?(tory)))
  1610.                 mode=history
  1611.                 ;;
  1612.             im?(p?(ort)))
  1613.                 mode=import
  1614.                 ;;
  1615.             re?(l?(ease)))
  1616.                 mode=release
  1617.                 ;;
  1618.             ?(r)log)
  1619.                 mode=log
  1620.                 ;;
  1621.             @(rdiff|patch))
  1622.                 mode=rdiff
  1623.                 ;;
  1624.             @(remove|rm|delete))
  1625.                 mode=remove
  1626.                 ;;
  1627.             @(rtag|rfreeze))
  1628.                 mode=rtag
  1629.                 ;;
  1630.             st?(at?(us)))
  1631.                 mode=status
  1632.                 ;;
  1633.             @(tag|freeze))
  1634.                 mode=tag
  1635.                 ;;
  1636.             up?(d?(ate)))
  1637.                 mode=update
  1638.                 ;;
  1639.             *)
  1640.                 ;;
  1641.             esac
  1642.         elif [[ "$i" = -* ]]; then
  1643.             flags=( "${flags[@]}" $i )
  1644.         fi
  1645.         count=$((++count))
  1646.     done
  1647.  
  1648.     case "$mode" in
  1649.     add)
  1650.         if [[ "$cur" != -* ]]; then
  1651.             set_prefix
  1652.             if [ $COMP_CWORD -gt 1 -a -r ${prefix:-}CVS/Entries ]; then
  1653.                 get_entries
  1654.                 [ -z "$cur" ] && \
  1655.                 files=$( command ls -Ad !(CVS) ) || \
  1656.                 files=$( command ls -d ${cur}* 2>/dev/null )
  1657.                 for i in "${entries[@]}"; do
  1658.                     files=( ${files[@]/#$i//} )
  1659.                 done
  1660.                 COMPREPLY=( $( compgen -W '${files[@]}' -- \
  1661.                            $cur ) )
  1662.             fi
  1663.         else
  1664.             COMPREPLY=( $( compgen -W '-k -m' -- $cur ) )
  1665.         fi
  1666.         ;;
  1667.     admin)
  1668.         if [[ "$cur" = -* ]]; then
  1669.             COMPREPLY=( $( compgen -W '-i -a -A -e -b -c -k -l -u \
  1670.                            -L -U -m -M -n -N -o -q -I \
  1671.                            -s -t -t- -T -V -x -z' -- \
  1672.                     $cur ) )
  1673.         fi
  1674.         ;;
  1675.     annotate)
  1676.         if [[ "$cur" = -* ]]; then
  1677.             COMPREPLY=( $( compgen -W '-D -F -f -l -R -r' -- $cur ) )
  1678.         else
  1679.             get_entries
  1680.             COMPREPLY=( $( compgen -W '${entries[@]}' -- $cur ) )
  1681.         fi
  1682.         ;;
  1683.     checkout)
  1684.         if [[ "$cur" != -* ]]; then
  1685.             [ -z "$cvsroot" ] && cvsroot=$CVSROOT
  1686.             COMPREPLY=( $( cvs -d "$cvsroot" co -c 2> /dev/null | \
  1687.                     awk '{print $1}' ) )
  1688.             COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
  1689.         else
  1690.             COMPREPLY=( $( compgen -W '-A -N -P -R -c -f -l -n -p \
  1691.                           -s -r -D -d -k -j' -- $cur ) )
  1692.         fi
  1693.         ;;
  1694.     commit)
  1695.         set_prefix
  1696.  
  1697.         if [[ "$cur" != -* ]] && [ -r ${prefix:-}CVS/Entries ]; then
  1698.             # if $COMP_CVS_REMOTE is not null, 'cvs commit' will
  1699.             # complete on remotely checked-out files (requires
  1700.             # passwordless access to the remote repository
  1701.             if [ -n "${COMP_CVS_REMOTE:-}" ]; then
  1702.                 # this is the least computationally intensive
  1703.                 # way found so far, but other changes
  1704.                 # (something other than changed/removed/new)
  1705.                 # may be missing
  1706.                 changed=( $( cvs -q diff --brief 2>&1 | \
  1707.                 sed -ne 's/^Files [^ ]* and \([^ ]*\) differ$/\1/p' ) )
  1708.                 newremoved=( $( cvs -q diff --brief 2>&1 | \
  1709.                 sed -ne 's/^cvs diff: \([^ ]*\) .*, no comparison available$/\1/p' ) )
  1710.                 COMPREPLY=( $( compgen -W '${changed[@]:-} \
  1711.                            ${newremoved[@]:-}' -- $cur ) )
  1712.             else
  1713.                 _filedir
  1714.             fi
  1715.         else
  1716.             COMPREPLY=( $( compgen -W '-n -R -l -f -F -m -r' -- \
  1717.                        $cur ) )
  1718.         fi
  1719.         ;;
  1720.     cvsroot)
  1721.         if [ -r ~/.cvspass ]; then
  1722.             # Ugly escaping because of bash treating ':' specially
  1723.             cvsroots=$( sed 's/^[^ ]* //; s/:/\\:/g' ~/.cvspass )
  1724.             COMPREPLY=( $( compgen -W '$cvsroots' -- $cur ) )
  1725.         fi
  1726.         ;;
  1727.     export)
  1728.         if [[ "$cur" != -* ]]; then
  1729.             [ -z "$cvsroot" ] && cvsroot=$CVSROOT
  1730.             COMPREPLY=( $( cvs -d "$cvsroot" co -c | awk '{print $1}' ) )
  1731.             COMPREPLY=( $( compgen -W '${COMPREPLY[@]}' -- $cur ) )
  1732.         else
  1733.             COMPREPLY=( $( compgen -W '-N -f -l -R -n \
  1734.                           -r -D -d -k' -- $cur ) )
  1735.         fi
  1736.         ;;
  1737.     diff)
  1738.         if [[ "$cur" == -* ]]; then
  1739.             _longopt diff
  1740.         else
  1741.             get_entries
  1742.             COMPREPLY=( $( compgen -W '${entries[@]:-}' -- $cur ) )
  1743.         fi
  1744.         ;;
  1745.     remove)
  1746.         if [[ "$cur" != -* ]]; then
  1747.             set_prefix
  1748.             if [ $COMP_CWORD -gt 1 -a -r ${prefix:-}CVS/Entries ]; then
  1749.                 get_entries
  1750.                 # find out what files are missing
  1751.                 for i in "${entries[@]}"; do
  1752.                     [ ! -r "$i" ] && miss=( "${miss[@]}" $i )
  1753.                 done
  1754.                 COMPREPLY=( $(compgen -W '${miss[@]:-}' -- $cur) )
  1755.             fi
  1756.         else
  1757.             COMPREPLY=( $( compgen -W '-f -l -R' -- $cur ) )
  1758.         fi
  1759.         ;;
  1760.     import)
  1761.         if [[ "$cur" != -* ]]; then
  1762.             # starts with same algorithm as checkout
  1763.             [ -z "$cvsroot" ] && cvsroot=$CVSROOT
  1764.             prefix=${cur%/*}
  1765.             if [ -r ${cvsroot}/${prefix} ]; then
  1766.                 get_modules
  1767.                 COMPREPLY=( ${COMPREPLY[@]#$cvsroot} )
  1768.                 COMPREPLY=( ${COMPREPLY[@]#\/} )
  1769.             fi
  1770.             pwd=$( pwd )
  1771.             pwd=${pwd##*/}
  1772.             COMPREPLY=( $( compgen -W '${COMPREPLY[@]} $pwd' -- \
  1773.                        $cur ) )
  1774.         else
  1775.             COMPREPLY=( $( compgen -W '-d -k -I -b -m -W' -- $cur ))
  1776.         fi
  1777.         ;;
  1778.     update)
  1779.         if [[ "$cur" = -* ]]; then
  1780.             COMPREPLY=( $( compgen -W '-A -P -C -d -f -l -R -p \
  1781.                            -k -r -D -j -I -W' -- \
  1782.                            $cur ) )
  1783.         fi
  1784.         ;;
  1785.     "")
  1786.         COMPREPLY=( $( compgen -W 'add admin annotate checkout ci co \
  1787.                        commit diff delete edit export \
  1788.                        freeze get history import log new \
  1789.                        patch rcs rdiff release remove \
  1790.                        rfreeze rlog rm rtag stat status \
  1791.                        tag unedit up update -H -Q -q -b \
  1792.                        -d -e -f -l -n -t -r -v -w -x -z \
  1793.                        --help --version' -- $cur ) )
  1794.         ;;
  1795.     *)
  1796.         ;;
  1797.     esac
  1798.     
  1799.     return 0
  1800. }
  1801. complete -F _cvs $default cvs
  1802. }
  1803.  
  1804. have rpm && {
  1805. # helper functions for rpm completion
  1806. #
  1807. _rpm_installed_packages()
  1808. {
  1809.     local ver nodig nosig
  1810.  
  1811.     if [ -r /var/log/rpmpkgs -a \
  1812.         /var/log/rpmpkgs -nt /var/lib/rpm/Packages ]; then
  1813.         # using RHL 7.2 or later - this is quicker than querying the DB
  1814.         COMPREPLY=( $( sed -ne \
  1815.         's|^\('$cur'.*\)-[0-9a-zA-Z._]\+-[0-9a-z.@]\+.*\.rpm$|\1|p' \
  1816.                 /var/log/rpmpkgs ) )
  1817.     else
  1818.         nodig=""
  1819.         nosig=""
  1820.         ver=$(rpm --version)
  1821.         ver=${ver##* }
  1822.       
  1823.         if [[ "$ver" > "4.0.4" ]]; then
  1824.             nodig="--nodigest"
  1825.         fi
  1826.         if [[ "$ver" > "4.0.99" ]]; then
  1827.             nosig="--nosignature"
  1828.         fi
  1829.  
  1830.         COMPREPLY=( $( rpm -qa $nodig $nosig | sed -ne \
  1831.         's|^\('$cur'.*\)-[0-9a-zA-Z._]\+-[0-9a-z.@]\+$|\1|p' ) )
  1832.     fi
  1833. }
  1834.  
  1835. _rpm_groups()
  1836. {
  1837.     local IFS=$'\t'
  1838.     # remove trailing backslash, or grep will complain
  1839.     cur=${cur%"\\"}
  1840.     COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat '%{group}\n' | \
  1841.                grep "^$cur" ) )
  1842.     # backslash escape spaces and translate newlines to tabs
  1843.     COMPREPLY=( $( echo "${COMPREPLY[@]}" | sed 's/ /\\ /g' | tr '\n' '\t' ) )
  1844. }
  1845.  
  1846. # rpm(8) completion
  1847. _rpm()
  1848. {
  1849.     local cur prev ver nodig nosig
  1850.  
  1851.     COMPREPLY=()
  1852.     cur=`_get_cword`
  1853.     prev=${COMP_WORDS[COMP_CWORD-1]}
  1854.     nodig=""
  1855.     nosig=""
  1856.     ver=$(rpm --version); ver=${ver##* }
  1857.   
  1858.     if [[ "$ver" > "4.0.4" ]]; then
  1859.         nodig="--nodigest"
  1860.     fi
  1861.     if [[ "$ver" > "4.0.99" ]]; then
  1862.         nosig="--nosignature"
  1863.     fi
  1864.  
  1865.     if [ $COMP_CWORD -eq 1 ]; then
  1866.         # first parameter on line
  1867.         case "$cur" in
  1868.         -b*)
  1869.             COMPREPLY=( $( compgen -W '-ba -bb -bc -bi -bl -bp -bs'\
  1870.                        -- $cur ) )
  1871.             ;;
  1872.         -t*)
  1873.             COMPREPLY=( $( compgen -W '-ta -tb -tc -ti -tl -tp -ts'\
  1874.                        -- $cur ) )
  1875.             ;;
  1876.         --*)
  1877.             COMPREPLY=( $( compgen -W '--help --version --initdb \
  1878.             --checksig --recompile --rebuild --resign --addsign \
  1879.             --rebuilddb --showrc --setperms --setugids --tarbuild \
  1880.             --eval --install --upgrade --query --freshen --erase \
  1881.             --verify --querytags --rmsource --rmspec --clean \
  1882.             --import' -- $cur ) )
  1883.             ;;
  1884.         *)
  1885.             COMPREPLY=( $( compgen -W '-b -e -F -i -q -t -U -V' \
  1886.                        -- $cur ) )
  1887.             ;;
  1888.         esac
  1889.  
  1890.     return 0
  1891.     fi
  1892.  
  1893.     case "$prev" in
  1894.     --@(@(db|exclude)path|prefix|relocate|root))
  1895.         _filedir -d
  1896.         return 0
  1897.         ;;
  1898.     --eval)
  1899.         # get a list of macros
  1900.         COMPREPLY=( $( sed -ne 's|^\(%'${cur#\%}'[^ '$'\t'']*\).*$|\1|p' \
  1901.                    /usr/lib/rpm/macros ) )
  1902.         return 0
  1903.         ;;
  1904.     --pipe)
  1905.         COMPREPLY=( $( compgen -c -- $cur ) )
  1906.         return 0
  1907.         ;;
  1908.     --rcfile)
  1909.         _filedir
  1910.         return 0
  1911.         ;;
  1912.     --specfile)
  1913.         # complete on .spec files
  1914.         _filedir spec
  1915.         return 0
  1916.         ;;
  1917.     --whatprovides)
  1918.         if [[ "$cur" == */* ]]; then
  1919.             _filedir
  1920.         else
  1921.         # complete on capabilities
  1922.             COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat \
  1923.                     '%{providename}\n' | grep "^$cur" ) )
  1924.         fi
  1925.         return 0
  1926.         ;;
  1927.     --whatrequires)
  1928.         # complete on capabilities
  1929.         COMPREPLY=( $( rpm -qa $nodig $nosig --queryformat \
  1930.                 '%{requirename}\n' | grep "^$cur" ) )
  1931.         return 0
  1932.         ;;
  1933.     esac
  1934.  
  1935.     case "${COMP_WORDS[1]}" in
  1936.     -@([iFU]*|-install|-freshen|-upgrade))
  1937.         if [[ "$cur" == -* ]]; then
  1938.             COMPREPLY=( $( compgen -W '--percent --force --test \
  1939.             --replacepkgs --replacefiles --root --excludedocs \
  1940.             --includedocs --noscripts --rcfile --ignorearch \
  1941.             --dbpath --prefix --ignoreos --nodeps --allfiles \
  1942.             --ftpproxy --ftpport --justdb --httpproxy --httpport \
  1943.             --noorder --relocate --badreloc --notriggers \
  1944.             --excludepath --ignoresize --oldpackage --define \
  1945.             --eval --pipe --queryformat --repackage --nosuggests \
  1946.             --nodigest --nosignature' -- $cur ) )
  1947.         else
  1948.             _filedir 'rpm'
  1949.         fi
  1950.         ;;
  1951.     -@(e|-erase))
  1952.         if [[ "$cur" == -* ]]; then
  1953.             COMPREPLY=( $( compgen -W '--allmatches --noscripts \
  1954.             --notriggers --nodeps --test --repackage' -- $cur ) )
  1955.         else
  1956.             _rpm_installed_packages
  1957.         fi
  1958.         ;;
  1959.     -@(q*|-query))
  1960.         # check whether we're doing file completion
  1961.         if [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then
  1962.             if [[ "$cur" == -* ]]; then
  1963.             COMPREPLY=( $( compgen -W '--scripts --root \
  1964.                 --rcfile --requires --ftpport --ftpproxy \
  1965.                 --httpproxy --httpport --provides --triggers \
  1966.                 --dump --changelog --dbpath \
  1967.                 --last --filesbypkg \
  1968.                 --info --list --state \
  1969.                 --docfiles --configfiles --queryformat \
  1970.                 --conflicts --obsoletes \
  1971.                 --nodigest --nosignature \
  1972.                 --triggerscripts' -- $cur ) )
  1973.             else
  1974.             _filedir
  1975.             fi
  1976.         elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then
  1977.             _rpm_groups
  1978.         elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then
  1979.             # uninstalled package completion
  1980.             if [[ "$cur" == -* ]]; then
  1981.                 COMPREPLY=( $( compgen -W '--scripts --root \
  1982.                 --rcfile --whatprovides --whatrequires \
  1983.                 --requires --triggeredby --ftpport --ftpproxy \
  1984.                 --httpproxy --httpport --provides --triggers \
  1985.                 --dump --changelog --dbpath --filesbypkg \
  1986.                 --define --eval --pipe --showrc --info --list \
  1987.                 --state --docfiles --configfiles --queryformat\
  1988.                 --conflicts --obsoletes --nodigest \
  1989.                 --nosignature' -- $cur ) )
  1990.             else
  1991.                 _filedir 'rpm'
  1992.             fi
  1993.         else
  1994.             # installed package completion
  1995.             if [[ "$cur" == -* ]]; then
  1996.                 COMPREPLY=( $( compgen -W '--scripts --root \
  1997.                 --rcfile --whatprovides --whatrequires \
  1998.                 --requires --triggeredby --ftpport --ftpproxy \
  1999.                 --httpproxy --httpport --provides --triggers \
  2000.                 --dump --changelog --dbpath --specfile \
  2001.                 --querybynumber --last --filesbypkg --define \
  2002.                 --eval --pipe --showrc --info --list --state \
  2003.                 --docfiles --configfiles --queryformat \
  2004.                 --conflicts --obsoletes --pkgid --hdrid \
  2005.                 --fileid --tid --nodigest --nosignature \
  2006.                 --triggerscripts' -- $cur ) )
  2007.             elif [ "${COMP_LINE#* -*([^ -])a}" == "$COMP_LINE" ]; then
  2008.                 _rpm_installed_packages
  2009.             fi
  2010.         fi
  2011.         ;;
  2012.     -@(K*|-checksig))
  2013.         if [[ "$cur" == -* ]]; then
  2014.             COMPREPLY=( $( compgen -W '--nopgp --nogpg --nomd5 \
  2015.                     --nodigest --nosignature' -- $cur ) )
  2016.         else
  2017.             _filedir 'rpm'
  2018.         fi
  2019.         ;;
  2020.     -@([Vy]*|-verify))
  2021.         if [[ "$cur" == -* ]]; then
  2022.             COMPREPLY=( $( compgen -W '--root --rcfile --dbpath \
  2023.             --nodeps --nogroup --nolinkto --nomode --nomtime \
  2024.             --nordev --nouser --nofiles --noscripts --nomd5 \
  2025.             --querytags --specfile --whatrequires --whatprovides \
  2026.             --nodigest --nosignature' -- $cur ) )
  2027.         # check whether we're doing file completion
  2028.         elif [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then
  2029.             _filedir
  2030.         elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then
  2031.             _rpm_groups
  2032.         elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then
  2033.             _filedir 'rpm'
  2034.         else
  2035.             _rpm_installed_packages
  2036.         fi
  2037.         ;;
  2038.     -[bt]*)
  2039.         if [[ "$cur" == -* ]]; then
  2040.             COMPREPLY=( $( compgen -W '--short-circuit --timecheck \
  2041.             --clean --rmsource --rmspec --test --sign --buildroot \
  2042.             --target -- buildarch --buildos --nobuild --nodeps \
  2043.             --nodirtokens' -- $cur ) )
  2044.         elif [[ ${COMP_WORDS[1]} == -b* ]]; then
  2045.             _filedir 'spec'
  2046.         else
  2047.             _filedir '@(tgz|tar.@(gz|bz2))'
  2048.         fi
  2049.         ;;
  2050.     --re@(build|compile))
  2051.         if [[ "$cur" == -* ]]; then
  2052.             COMPREPLY=( $( compgen -W '--nodeps --rmsource \
  2053.               --rmspec --sign --nodirtokens --target' -- $cur ) )
  2054.         else
  2055.             _filedir '?(no)src.rpm'
  2056.         fi
  2057.         ;;
  2058.     --tarbuild)
  2059.         _filedir '@(tgz|tar.@(gz|bz2))'
  2060.         ;;
  2061.     --@(re|add)sign)
  2062.         _filedir 'rpm'
  2063.         ;;
  2064.     --set@(perms|gids))
  2065.         _rpm_installed_packages
  2066.         ;;
  2067.     --@(clean|rms@(ource|pec)))
  2068.         if [[ "$cur" == -* ]]; then
  2069.             COMPREPLY=( $( compgen -W '--clean --rmsource \
  2070.                     --rmspec' -- $cur ) )
  2071.         else
  2072.             _filedir 'spec'
  2073.         fi
  2074.         ;;
  2075.     --@(import|dbpath|root))
  2076.         if [[ "$cur" == -* ]]; then
  2077.             COMPREPLY=( $( compgen -W '--import --dbpath --root' \
  2078.                     -- $cur ) )
  2079.         else
  2080.             _filedir
  2081.         fi
  2082.         ;;
  2083.     esac
  2084.  
  2085.     return 0
  2086. }
  2087. complete -F _rpm $filenames rpm rpmbuild
  2088. }
  2089.  
  2090. # Debian apt-get(8) completion.
  2091. #
  2092. have apt-get &&
  2093. _apt_get()
  2094. {
  2095.     local cur prev special i
  2096.  
  2097.     COMPREPLY=()
  2098.     cur=`_get_cword`
  2099.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2100.  
  2101.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  2102.         if [[ ${COMP_WORDS[i]} == @(install|remove|purge|source|build-dep) ]]; then
  2103.             special=${COMP_WORDS[i]}
  2104.         fi
  2105.     done
  2106.  
  2107.     if [ -n "$special" ]; then
  2108.         case $special in
  2109.         remove|purge)
  2110.             if [ -f /etc/debian_version ]; then
  2111.                 # Debian system
  2112.                 COMPREPLY=( $( _comp_dpkg_installed_packages \
  2113.                         $cur ) )
  2114.             else
  2115.                 # assume RPM based
  2116.                 _rpm_installed_packages
  2117.             fi
  2118.             return 0
  2119.             ;;
  2120.         *)
  2121.             COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )
  2122.             return 0
  2123.             ;;
  2124.  
  2125.         esac
  2126.     fi
  2127.  
  2128.     case "$prev" in
  2129.         -@(c|-config-file))
  2130.               _filedir
  2131.              return 0
  2132.              ;;
  2133.  
  2134.         -@(t|-target-release|-default-release))
  2135.              COMPREPLY=( $( apt-cache policy | \
  2136.                     grep "release.o=Debian,a=$cur" | \
  2137.                     sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null) )
  2138.              return 0
  2139.              ;;
  2140.  
  2141.     esac
  2142.  
  2143.     if [[ "$cur" == -* ]]; then
  2144.  
  2145.         COMPREPLY=( $( compgen -W '-d -f -h -v -m -q -s -y \
  2146.                 -u -t -b -c -o --download-only --fix-broken \
  2147.                 --help --version --ignore-missing \
  2148.                 --fix-missing --no-download --quiet --simulate \
  2149.                 --just-print --dry-run --recon --no-act --yes \
  2150.                 --assume-yes --show-upgraded --only-source \
  2151.                 --compile --build --ignore-hold \
  2152.                 --target-release --no-upgrade --force-yes \
  2153.                 --print-uris --purge --reinstall \
  2154.                 --list-cleanup --default-release \
  2155.                 --trivial-only --no-remove --diff-only \
  2156.                 --tar-only --config-file --option --auto-remove' -- $cur ) )
  2157.     else
  2158.  
  2159.         COMPREPLY=( $( compgen -W 'update upgrade dselect-upgrade \
  2160.                 dist-upgrade install remove purge source \
  2161.                 build-dep check clean autoclean autoremove' \
  2162.                 -- $cur ) )
  2163.  
  2164.     fi
  2165.  
  2166.  
  2167.     return 0
  2168. } &&
  2169. complete -F _apt_get $filenames apt-get
  2170.  
  2171. # Debian apt-cache(8) completion.
  2172. #
  2173. have apt-cache &&
  2174. _apt_cache()
  2175. {
  2176.     local cur prev special i
  2177.  
  2178.     COMPREPLY=()
  2179.     cur=`_get_cword`
  2180.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2181.  
  2182.     
  2183.     if [ "$cur" != show ]; then
  2184.         for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  2185.         if [[ ${COMP_WORDS[i]} == @(add|depends|dotty|policy|rdepends|madison|show?(pkg|src|)) ]]; then
  2186.             special=${COMP_WORDS[i]}
  2187.         fi
  2188.         done
  2189.     fi
  2190.  
  2191.  
  2192.     if [ -n "$special" ]; then
  2193.         case $special in
  2194.         add)
  2195.             _filedir
  2196.             return 0
  2197.             ;;
  2198.         
  2199.          *)
  2200.             COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )
  2201.             return 0
  2202.             ;;
  2203.         
  2204.         esac
  2205.     fi
  2206.  
  2207.  
  2208.     case "$prev" in
  2209.          -@(c|p|s|-config-file|-@(pkg|src)-cache))
  2210.              _filedir
  2211.              return 0
  2212.              ;;
  2213.          search)
  2214.              if [[ "$cur" != -* ]]; then
  2215.                 return 0
  2216.              fi
  2217.              ;;
  2218.     esac
  2219.  
  2220.     if [[ "$cur" == -* ]]; then
  2221.  
  2222.         COMPREPLY=( $( compgen -W '-h -v -p -s -q -i -f -a -g -c \
  2223.                 -o --help --version --pkg-cache --src-cache \
  2224.                 --quiet --important --full --all-versions \
  2225.                 --no-all-versions --generate --no-generate \
  2226.                 --names-only --all-names --recurse \
  2227.                 --config-file --option' -- $cur ) )
  2228.     else
  2229.  
  2230.         COMPREPLY=( $( compgen -W 'add gencaches show showpkg showsrc \
  2231.                 stats dump dumpavail unmet search search \
  2232.                 depends rdepends pkgnames dotty xvcg \
  2233.                 policy madison' -- $cur ) )
  2234.  
  2235.     fi
  2236.  
  2237.  
  2238.     return 0
  2239. } &&
  2240. complete -F _apt_cache $filenames apt-cache
  2241.  
  2242.  
  2243. # Debian aptitude(1) completion
  2244. #
  2245. have aptitude && {
  2246. have grep-status && {
  2247. _comp_dpkg_hold_packages()
  2248. {
  2249.     grep-status -P -e "^$1" -a -FStatus 'hold' -n -s Package
  2250. }
  2251. } || {
  2252. _comp_dpkg_hold_packages()
  2253. {
  2254.     grep -B 2 'hold' /var/lib/dpkg/status | grep "Package: $1" \
  2255.         | cut -d\  -f2
  2256. }
  2257. }
  2258.  
  2259. _aptitude()
  2260. {
  2261.     local cur dashoptions prev special i
  2262.  
  2263.     COMPREPLY=()
  2264.     cur=`_get_cword`
  2265.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2266.  
  2267.  
  2268.     dashoptions='-S -u -i -h --help --version -s --simulate -d \
  2269.              --download-only -P --prompt -y --assume-yes -F \
  2270.              --display-format -O --sort -w --width -f -r -g \
  2271.              --with-recommends --with-suggests -R -G \
  2272.              --without-recommends --without-suggests -t \
  2273.              --target-release -V --show-versions -D --show-deps\
  2274.              -Z -v --verbose --purge-unused'
  2275.  
  2276.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  2277.         if [[ ${COMP_WORDS[i]} == @(install|reinstall|hold|unhold|markauto|unmarkauto|dist-upgrade|full-upgrade|download|show|forbid-version|purge|remove|changelog|why|why-not|keep|keep-all) ]]; then
  2278.         special=${COMP_WORDS[i]}
  2279.         fi
  2280.         #exclude some mutually exclusive options
  2281.         [[ ${COMP_WORDS[i]} == '-u' ]] && dashoptions=${dashoptions/-i}
  2282.         [[ ${COMP_WORDS[i]} == '-i' ]] && dashoptions=${dashoptions/-u}
  2283.     done
  2284.  
  2285.     if [[ -n "$special" ]]; then
  2286.        case $special in
  2287.            @(install|hold|markauto|unmarkauto|dist-upgrade|full-upgrade|download|show|changelog|why|why-not))
  2288.            COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )
  2289.            return 0
  2290.            ;;
  2291.            @(purge|remove|reinstall|forbid-version))
  2292.              COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) )
  2293.            return 0
  2294.            ;;
  2295.            unhold)
  2296.              COMPREPLY=( $( _comp_dpkg_hold_packages $cur ) )
  2297.            return 0
  2298.            ;;
  2299.  
  2300.        esac
  2301.     fi
  2302.  
  2303.     case $prev in
  2304.         # don't complete anything if these options are found
  2305.         @(autoclean|clean|forget-new|search|upgrade|safe-upgrade|update|keep-all))
  2306.         return 0
  2307.         ;;
  2308.  
  2309.         -S)
  2310.         _filedir
  2311.         return 0
  2312.         ;;
  2313.  
  2314.         -@(t|-target-release|-default-release))
  2315.         COMPREPLY=( $( apt-cache policy | \
  2316.             grep "release.o=Debian,a=$cur" | \
  2317.             sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null ) )
  2318.         return 0
  2319.         ;;
  2320.  
  2321.     esac
  2322.  
  2323.     if [[ "$cur" == -* ]]; then
  2324.         COMPREPLY=( $( compgen -W "$dashoptions" -- $cur ) )
  2325.     else
  2326.         COMPREPLY=( $( compgen -W 'update upgrade safe-upgrade forget-new clean \
  2327.                        autoclean install reinstall remove \
  2328.                        hold unhold purge markauto unmarkauto why why-not \
  2329.                        dist-upgrade full-upgrade download search show \
  2330.                        forbid-version changelog keep-all' -- $cur ) )
  2331.     fi
  2332.  
  2333.  
  2334.     return 0
  2335. }
  2336. complete -F _aptitude $default aptitude
  2337. }
  2338.  
  2339. # Debian apt-build(1) completion.
  2340. #
  2341. have apt-build &&
  2342. _apt_build()
  2343. {
  2344.     local cur prev special i
  2345.  
  2346.     COMPREPLY=()
  2347.     cur=`_get_cword`
  2348.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2349.  
  2350.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  2351.         if [[ ${COMP_WORDS[i]} == @(install|remove|source|info|clean) ]]; then
  2352.             special=${COMP_WORDS[i]}
  2353.         fi
  2354.     done
  2355.  
  2356.     if [ -n "$special" ]; then
  2357.         case $special in
  2358.         @(install|source|info))
  2359.             COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )
  2360.             return 0
  2361.             ;;
  2362.         remove)
  2363.             COMPREPLY=( $( _comp_dpkg_installed_packages \
  2364.                     $cur ) )
  2365.             return 0
  2366.             ;;
  2367.         *)
  2368.             return 0
  2369.             ;;
  2370.         esac
  2371.     fi
  2372.  
  2373.     case "$prev" in
  2374.  
  2375.          --@(patch|build-dir|repository-dir))
  2376.            _filedir
  2377.            return 0
  2378.            ;;
  2379.  
  2380.          -@(h|-help))
  2381.            return 0
  2382.            ;;
  2383.  
  2384.     esac
  2385.  
  2386.     if [[ "$cur" == -* ]]; then
  2387.         COMPREPLY=( $( compgen -W '--help --show-upgraded -u --build-dir \
  2388.                   --repository-dir --build-only \
  2389.                   --build-command --reinstall --rebuild \
  2390.                   --remove-builddep --no-wrapper --purge \
  2391.                   --patch --patch-strip -p --yes -y \
  2392.                   --version -v --no-source' -- $cur ) )
  2393.  
  2394.     else
  2395.         COMPREPLY=( $( compgen -W 'update upgrade install remove \
  2396.                   source dist-upgrade world clean info \
  2397.                   clean-build update-repository ' -- $cur ) )
  2398.     fi
  2399.  
  2400.  
  2401.     return 0
  2402. } &&
  2403. complete -F _apt_build $filenames apt-build
  2404.  
  2405. # chsh(1) completion
  2406. #
  2407. _chsh()
  2408. {
  2409.     local cur prev
  2410.  
  2411.     COMPREPLY=()
  2412.     cur=`_get_cword`
  2413.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2414.  
  2415.     if [ "$prev" = "-s" ]; then
  2416.       if [ -f /etc/debian_version ]; then
  2417.         COMPREPLY=( $( </etc/shells ) )
  2418.       else
  2419.         COMPREPLY=( $( chsh -l | grep "^$cur" ) )
  2420.       fi
  2421.     else
  2422.       COMPREPLY=( $( compgen -u -- $cur ) )
  2423.     fi
  2424.  
  2425.     return 0
  2426. }
  2427. complete -F _chsh chsh
  2428.  
  2429. # chkconfig(8) completion
  2430. #
  2431. have chkconfig &&
  2432. _chkconfig()
  2433. {
  2434.     local cur prev
  2435.  
  2436.     COMPREPLY=()
  2437.     cur=`_get_cword`
  2438.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2439.  
  2440.     case "$prev" in
  2441.     @([1-6]|--@(list|add|del)))
  2442.         _services
  2443.         return 0
  2444.         ;;
  2445.     --level)
  2446.         COMPREPLY=( $( compgen -W '1 2 3 4 5 6' -- $cur ) )
  2447.         return 0
  2448.         ;;
  2449.     esac
  2450.  
  2451.     if [[ "$cur" == -* ]]; then
  2452.         COMPREPLY=( $( compgen -W '--list --add --del --level' -- $cur ) )
  2453.     else
  2454.         if [ $COMP_CWORD -eq 2 -o $COMP_CWORD -eq 4 ]; then
  2455.             COMPREPLY=( $( compgen -W 'on off reset' -- $cur ) )
  2456.         else
  2457.             _services
  2458.         fi
  2459.     fi
  2460. } &&
  2461. complete -F _chkconfig chkconfig
  2462.  
  2463. # This function provides simple user@host completion
  2464. #
  2465. _user_at_host() {
  2466.     local cur
  2467.  
  2468.     COMPREPLY=()
  2469.     cur=`_get_cword`
  2470.  
  2471.     if [[ $cur == *@* ]]; then
  2472.         _known_hosts
  2473.     else
  2474.         COMPREPLY=( $( compgen -u -- "$cur" ) )
  2475.     fi
  2476.  
  2477.     return 0
  2478. }
  2479. shopt -u hostcomplete && complete -F _user_at_host $nospace talk ytalk finger
  2480.  
  2481. # This function performs host completion based on ssh's known_hosts files,
  2482. # defaulting to standard host completion if they don't exist.
  2483. #
  2484. _known_hosts()
  2485. {
  2486.        local cur curd ocur user suffix aliases global_kh user_kh hosts i host
  2487.        local -a kh khd config
  2488.  
  2489.     COMPREPLY=()
  2490.     cur=`_get_cword`
  2491.     ocur=$cur
  2492.  
  2493.     [ "$1" = -a ] || [ "$2" = -a ] && aliases='yes'
  2494.     [ "$1" = -c ] || [ "$2" = -c ] && suffix=':'
  2495.     [[ $cur == *@* ]] && user=${cur%@*}@ && cur=${cur#*@}
  2496.     kh=()
  2497.  
  2498.     # ssh config files
  2499.     [ -r /etc/ssh/ssh_config ] &&
  2500.       config=( "${config[@]}" "/etc/ssh/ssh_config" )
  2501.     [ -r "${HOME}/.ssh/config" ] &&
  2502.       config=( "${config[@]}" "${HOME}/.ssh/config" )
  2503.     [ -r "${HOME}/.ssh2/config" ] &&
  2504.       config=( "${config[@]}" "${HOME}/.ssh2/config" )
  2505.  
  2506.     if [ ${#config[@]} -gt 0 ]; then
  2507.         # expand path (if present) to global known hosts file
  2508.         global_kh=$( eval echo $( sed -ne 's/^[ \t]*[Gg][Ll][Oo][Bb][Aa][Ll][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" ) )
  2509.         # expand path (if present) to user known hosts file
  2510.         user_kh=$( eval echo $( sed -ne 's/^[ \t]*[Uu][Ss][Ee][Rr][Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee]['"$'\t '"']*\(.*\)$/\1/p' "${config[@]}" ) )
  2511.     fi
  2512.  
  2513.     # Global known_hosts files
  2514.     [ -r "$global_kh" ] &&
  2515.         kh=( "${kh[@]}" "$global_kh" )
  2516.     [ -r /etc/ssh/ssh_known_hosts ] &&
  2517.         kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts )
  2518.     [ -r /etc/ssh/ssh_known_hosts2 ] &&
  2519.         kh=( "${kh[@]}" /etc/ssh/ssh_known_hosts2 )
  2520.     [ -r /etc/known_hosts ] &&
  2521.         kh=( "${kh[@]}" /etc/known_hosts )
  2522.     [ -r /etc/known_hosts2 ] &&
  2523.         kh=( "${kh[@]}" /etc/known_hosts2 )
  2524.     [ -d /etc/ssh2/knownhosts ] &&
  2525.         khd=( "${khd[@]}" /etc/ssh2/knownhosts/*pub )
  2526.  
  2527.     # User known_hosts files
  2528.     [ -r "$user_kh" ] &&
  2529.         kh=( "${kh[@]}" "$user_kh" )
  2530.     [ -r ~/.ssh/known_hosts ] &&
  2531.         kh=( "${kh[@]}" ~/.ssh/known_hosts )
  2532.     [ -r ~/.ssh/known_hosts2 ] &&
  2533.         kh=( "${kh[@]}" ~/.ssh/known_hosts2 )
  2534.     [ -d ~/.ssh2/hostkeys ] &&
  2535.         khd=( "${khd[@]}" ~/.ssh2/hostkeys/*pub )
  2536.  
  2537.     # If we have known_hosts files to use
  2538.     if [ ${#kh[@]} -gt 0 -o ${#khd[@]} -gt 0 ]; then
  2539.         # Escape slashes and dots in paths for awk
  2540.         cur=${cur//\//\\\/}
  2541.         cur=${cur//\./\\\.}
  2542.         curd=$cur
  2543.  
  2544.         if [[ "$cur" == [0-9]*.* ]]; then
  2545.         # Digits followed by a dot - just search for that
  2546.         cur="^$cur.*"
  2547.         elif [[ "$cur" == [0-9]* ]]; then
  2548.         # Digits followed by no dot - search for digits followed
  2549.         # by a dot
  2550.         cur="^$cur.*\."
  2551.         elif [ -z "$cur" ]; then
  2552.         # A blank - search for a dot or an alpha character
  2553.         cur="[a-z.]"
  2554.         else
  2555.         cur="^$cur"
  2556.         fi
  2557.  
  2558.         if [ ${#kh[@]} -gt 0 ]; then
  2559.  
  2560.         # FS needs to look for a comma separated list
  2561.         COMPREPLY=( $( awk 'BEGIN {FS=","}
  2562.                 /^[^|]/ {for (i=1; i<=2; ++i) { \
  2563.                        gsub(" .*$", "", $i); \
  2564.                        if ($i ~ /'$cur'/) {print $i} \
  2565.                 }}' "${kh[@]}" 2>/dev/null ) )
  2566.         fi
  2567.         if [ ${#khd[@]} -gt 0 ]; then
  2568.         # Needs to look for files called
  2569.         # .../.ssh2/key_22_<hostname>.pub
  2570.         # dont fork any processes, because in a cluster environment, 
  2571.         # there can be hundreds of hostkeys
  2572.         for i in "${khd[@]}" ; do
  2573.             if [[ "$i" == *key_22_$curd*.pub ]] && [ -r "$i" ] ; then
  2574.             host=${i/#*key_22_/}
  2575.             host=${host/%.pub/}
  2576.             COMPREPLY=( "${COMPREPLY[@]}" $host )
  2577.             fi
  2578.         done
  2579.         fi
  2580.  
  2581.         # append any available aliases from config files
  2582.         if [ ${#config[@]} -gt 0 ] && [ -n "$aliases" ]; then
  2583.         local host_aliases=$( sed -ne 's/^[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\?['"$'\t '"']\+\([^*?]*\)$/\2/p' "${config[@]}" )
  2584.         hosts=$( compgen -W "$host_aliases" -- $ocur )
  2585.         COMPREPLY=( "${COMPREPLY[@]}" $hosts )
  2586.         fi
  2587.  
  2588.         # Now add results of normal hostname completion
  2589.         COMPREPLY=( "${COMPREPLY[@]}" $( compgen -A hostname -- $ocur ) )
  2590.  
  2591.         # apply suffix
  2592.         for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do
  2593.         COMPREPLY[i]=$user${COMPREPLY[i]}$suffix
  2594.         done
  2595.     else
  2596.         # Just do normal hostname completion
  2597.         COMPREPLY=( $( compgen -A hostname -S "$suffix" -- $cur ) )
  2598.     fi
  2599.  
  2600.     return 0
  2601. }
  2602. complete -F _known_hosts traceroute traceroute6 tracepath tracepath6 \
  2603.     ping ping6 fping fping6 telnet host nslookup rsh rlogin ftp dig ssh-installkeys mtr
  2604.  
  2605. # ssh(1) completion
  2606. #
  2607. have ssh && {
  2608. _ssh()
  2609. {
  2610.     local cur prev
  2611.     local -a config
  2612.  
  2613.     COMPREPLY=()
  2614.     cur=`_get_cword`
  2615.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2616.  
  2617.     case "$prev" in
  2618.     -*c)
  2619.         COMPREPLY=( $( compgen -W 'blowfish 3des 3des-cbc blowfish-cbc \
  2620.                arcfour cast128-cbc' -- $cur ) )
  2621.         ;;
  2622.     -*i)
  2623.         _filedir
  2624.         ;;
  2625.     -*l)
  2626.         COMPREPLY=( $( compgen -u -- $cur ) )
  2627.         ;;
  2628.     *)
  2629.         _known_hosts -a
  2630.  
  2631.         [ $COMP_CWORD -eq 1 ] || \
  2632.         COMPREPLY=( "${COMPREPLY[@]}" $( compgen -c -- $cur ) )
  2633.     esac
  2634.  
  2635.     return 0
  2636. }
  2637. shopt -u hostcomplete && complete -F _ssh ssh slogin sftp xhost autossh
  2638.  
  2639. # scp(1) completion
  2640. #
  2641. _scp()
  2642. {
  2643.     local cur userhost path
  2644.  
  2645.     COMPREPLY=()
  2646.     cur=`_get_cword ":"`
  2647.  
  2648.     _expand || return 0
  2649.  
  2650.     if [[ "$cur" == *:* ]]; then
  2651.         local IFS=$'\t\n'
  2652.         # remove backslash escape from :
  2653.         cur=${cur/\\:/:}
  2654.         userhost=${cur%%?(\\):*}
  2655.         path=${cur#*:}
  2656.         # unescape spaces
  2657.         path=${path//\\\\\\\\ / }
  2658.         if [ -z "$path" ]; then
  2659.             # default to home dir of specified user on remote host
  2660.             path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
  2661.         fi
  2662.         # escape spaces; remove executables, aliases, pipes and sockets;
  2663.         # add space at end of file names
  2664.         COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
  2665.                    command ls -aF1d "$path*" 2>/dev/null | \
  2666.                    sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \
  2667.                    -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
  2668.         return 0
  2669.     fi
  2670.  
  2671.     [[ "$cur" == */* ]] || _known_hosts -c -a
  2672.         local IFS=$'\t\n'
  2673.         COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* \
  2674.                 2>/dev/null | sed \
  2675.                 -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\&/g" \
  2676.                 -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
  2677.     return 0
  2678. }
  2679. complete -F _scp $nospace scp
  2680. }
  2681.  
  2682. # rsync(1) completion
  2683. #
  2684. have rsync &&
  2685. _rsync()
  2686. {
  2687.     local cur prev shell i userhost path
  2688.  
  2689.     COMPREPLY=()
  2690.     cur=`_get_cword`
  2691.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2692.  
  2693.     _expand || return 0
  2694.  
  2695.     case "$prev" in
  2696.     --@(config|password-file|include-from|exclude-from))
  2697.         _filedir
  2698.         return 0
  2699.         ;;
  2700.     -@(T|-temp-dir|-compare-dest))
  2701.         _filedir -d
  2702.         return 0
  2703.         ;;
  2704.     -@(e|-rsh))
  2705.         COMPREPLY=( $( compgen -W 'rsh ssh' -- $cur ) )
  2706.         return 0
  2707.         ;;
  2708.     esac
  2709.  
  2710.     case "$cur" in
  2711.     -*)
  2712.         COMPREPLY=( $( compgen -W '-v -q  -c -a -r -R -b -u -l -L -H \
  2713.                 -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
  2714.                 -z -h -4 -6 --verbose --quiet --checksum \
  2715.                 --archive --recursive --relative --backup \
  2716.                 --backup-dir --suffix= --update --links \
  2717.                 --copy-links --copy-unsafe-links --safe-links \
  2718.                 --hard-links --perms --owner --group --devices\
  2719.                 --times --sparse --dry-run --whole-file \
  2720.                 --no-whole-file --one-file-system \
  2721.                 --block-size= --rsh= --rsync-path= \
  2722.                 --cvs-exclude --existing --ignore-existing \
  2723.                 --delete --delete-excluded --delete-after \
  2724.                 --ignore-errors --max-delete= --partial \
  2725.                 --force --numeric-ids --timeout= \
  2726.                 --ignore-times --size-only --modify-window= \
  2727.                 --temp-dir= --compare-dest= --compress \
  2728.                 --exclude= --exclude-from= --include= \
  2729.                 --include-from= --version --daemon --no-detach\
  2730.                 --address= --config= --port= --blocking-io \
  2731.                 --no-blocking-io --stats --progress \
  2732.                 --log-format= --password-file= --bwlimit= \
  2733.                 --write-batch= --read-batch= --help' -- $cur ))
  2734.         ;;
  2735.     *:*)
  2736.         # find which remote shell is used
  2737.         shell=rsh
  2738.         for (( i=1; i < COMP_CWORD; i++ )); do
  2739.             if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
  2740.                 shell=${COMP_WORDS[i+1]}
  2741.                 break
  2742.             fi
  2743.         done
  2744.         if [[ "$shell" == ssh ]]; then
  2745.             # remove backslash escape from :
  2746.             cur=${cur/\\:/:}
  2747.             userhost=${cur%%?(\\):*}
  2748.             path=${cur#*:}
  2749.             # unescape spaces
  2750.             path=${path//\\\\\\\\ / }
  2751.             if [ -z "$path" ]; then
  2752.                 # default to home dir of specified
  2753.                 # user on remote host
  2754.                 path=$(ssh -o 'Batchmode yes' \
  2755.                     $userhost pwd 2>/dev/null)
  2756.             fi
  2757.             # escape spaces; remove executables, aliases, pipes
  2758.             # and sockets; add space at end of file names
  2759.             COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
  2760.                 command ls -aF1d "$path*" 2>/dev/null | \
  2761.                 sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
  2762.                 -e 's/[^\/]$/& /g' ) )
  2763.         fi
  2764.         ;;
  2765.     *)
  2766.         _known_hosts -c -a
  2767.         _filedir
  2768.         ;;
  2769.     esac
  2770.  
  2771.     return 0
  2772. } &&
  2773. complete -F _rsync $nospace $filenames rsync
  2774.  
  2775. # Linux route(8) completion
  2776. #
  2777. [ $UNAME = Linux ] &&
  2778. _route()
  2779. {
  2780.     local cur prev
  2781.  
  2782.     COMPREPLY=()
  2783.     cur=`_get_cword`
  2784.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2785.  
  2786.     if [ "$prev" = dev ]; then
  2787.         COMPREPLY=( $( ifconfig -a | sed -ne 's|^\('$cur'[^ ]*\).*$|\1|p' ))
  2788.         return 0
  2789.     fi
  2790.  
  2791.     COMPREPLY=( $( compgen -W 'add del -host -net netmask metric mss \
  2792.                    window irtt reject mod dyn reinstate dev \
  2793.                    default gw' -- $cur ) )
  2794.  
  2795.     COMPREPLY=( $( echo " ${COMP_WORDS[@]}" | \
  2796.                (while read -d ' ' i; do
  2797.                [ "$i" == "" ] && continue
  2798.                # flatten array with spaces on either side,
  2799.                # otherwise we cannot grep on word
  2800.                # boundaries of first and last word
  2801.                COMPREPLY=" ${COMPREPLY[@]} "
  2802.                # remove word from list of completions
  2803.                COMPREPLY=( ${COMPREPLY/ $i / } )
  2804.             done
  2805.                echo "${COMPREPLY[@]}")
  2806.           ) )
  2807.     return 0
  2808. }
  2809. [ $UNAME = Linux ] && complete -F _route route
  2810.  
  2811. # GNU make(1) completion
  2812. #
  2813. have make || have gmake || have gnumake || have pmake &&
  2814. _make()
  2815. {
  2816.     local file makef makef_dir="." makef_inc cur prev i
  2817.  
  2818.     COMPREPLY=()
  2819.     cur=`_get_cword`
  2820.     prev=${COMP_WORDS[COMP_CWORD-1]}
  2821.  
  2822.     # --name value style option
  2823.     case $prev in
  2824.         -@(f|o|W))
  2825.             _filedir
  2826.             return 0
  2827.             ;;
  2828.         -@(I|C))
  2829.             _filedir -d
  2830.             return 0
  2831.             ;;
  2832.     esac
  2833.  
  2834.     # --name=value style option
  2835.     if [[ "$cur" == *=* ]]; then
  2836.         prev=${cur/=*/}
  2837.         cur=${cur/*=/}
  2838.         case "$prev" in
  2839.             --@(file|makefile))
  2840.                 _filedir
  2841.                 return 0
  2842.                 ;;
  2843.             --@(directory|include-dir))
  2844.                 _filedir -d
  2845.                 return 0
  2846.                 ;;
  2847.         esac
  2848.     fi
  2849.  
  2850.     if [[ "$cur" == -* ]]; then
  2851.         COMPREPLY=( $( compgen -W '-b -m -B -C -d -e -f -h -i -I\
  2852.             -j -l -k -n -o -p -q -r -R - s -S -t -v -w -W \
  2853.             --always-make --directory= --debug \
  2854.             --environment-overrides --file= --makefile= --help \
  2855.             --ignore-errors --include-dir= --jobs --load-average \
  2856.             --max-load --keep-going --just-print --dry-run \
  2857.             --recon --old-file= --assume-old= --print-data-base \
  2858.             --question --no-builtin-rules --no-builtin-variables \
  2859.             --silent --quiet --no-keep-goind --stop --touch \
  2860.             --version --print-directory --no-print-directory \
  2861.             --what-if= --new-file= --assume-new= \
  2862.             --warn-undefined-variables' -- $cur ) )
  2863.     else
  2864.         # before we check for makefiles, see if a path was specified
  2865.         # with -C
  2866.         for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do
  2867.             if [[ ${COMP_WORDS[i]} == -C ]]; then
  2868.                 # eval for tilde expansion
  2869.                 eval makef_dir=${COMP_WORDS[i+1]}
  2870.                 break
  2871.             fi
  2872.         done
  2873.  
  2874.         # make reads `GNUmakefile', then `makefile', then `Makefile'
  2875.         if [ -f ${makef_dir}/GNUmakefile ]; then
  2876.             makef=${makef_dir}/GNUmakefile
  2877.         elif [ -f ${makef_dir}/makefile ]; then
  2878.             makef=${makef_dir}/makefile
  2879.         elif [ -f ${makef_dir}/Makefile ]; then
  2880.             makef=${makef_dir}/Makefile
  2881.         else
  2882.             makef=${makef_dir}/*.mk           # local convention
  2883.         fi
  2884.  
  2885.         # before we scan for targets, see if a Makefile name was
  2886.         # specified with -f
  2887.         for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do
  2888.             if [[ ${COMP_WORDS[i]} == -f ]]; then
  2889.                 # eval for tilde expansion
  2890.                 eval makef=${COMP_WORDS[i+1]}
  2891.                 break
  2892.             fi
  2893.         done
  2894.  
  2895.         [ ! -f $makef ] && return 0
  2896.  
  2897.         # deal with included Makefiles
  2898.          makef_inc=$( grep -E '^-?include' $makef | sed -e "s,^.* ,"$makef_dir"/," )
  2899.  
  2900.          for file in $makef_inc; do
  2901.              [ -f $file ] && makef="$makef $file"
  2902.          done
  2903.  
  2904.         COMPREPLY=( $( awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
  2905.                 {split($1,A,/ /);for(i in A)print A[i]}' \
  2906.                 $makef 2>/dev/null | command grep "^$cur" ))
  2907.     fi
  2908. } &&
  2909. complete -f -F _make $filenames make gmake gnumake pmake
  2910.  
  2911. # GNU tar(1) completion
  2912. #
  2913. _tar()
  2914. {
  2915.     local cur ext regex tar untar
  2916.  
  2917.     COMPREPLY=()
  2918.     cur=`_get_cword`
  2919.  
  2920.     if [ $COMP_CWORD -eq 1 ]; then
  2921.         COMPREPLY=( $( compgen -W 'c t x u r d A' -- $cur ) )
  2922.         return 0
  2923.     fi
  2924.  
  2925.     case "${COMP_WORDS[1]}" in
  2926.     ?(-)[cr]*f)
  2927.         _filedir
  2928.         return 0
  2929.         ;;
  2930.     +([^IZzjy])f)
  2931.         ext='t@(ar?(.@(Z|gz|bz?(2)))|gz|bz?(2))'
  2932.         regex='t\(ar\(\.\(Z\|gz\|bz2\?\)\)\?\|gz\|bz2\?\)'
  2933.         ;;
  2934.     *[Zz]*f)
  2935.         ext='t?(ar.)@(gz|Z)'
  2936.         regex='t\(ar\.\)\?\(gz\|Z\)'
  2937.         ;;
  2938.     *[Ijy]*f)
  2939.         ext='t?(ar.)bz?(2)'
  2940.         regex='t\(ar\.\)\?bz2\?'
  2941.         ;;
  2942.     *)
  2943.         _filedir
  2944.         return 0
  2945.         ;;
  2946.         
  2947.     esac
  2948.  
  2949.     if [[ "$COMP_LINE" == *$ext' ' ]]; then
  2950.         # complete on files in tar file
  2951.         #
  2952.         # get name of tar file from command line
  2953.         tar=$( echo "$COMP_LINE" | \
  2954.             sed -e 's/^.* \([^ ]*'$regex'\) .*$/\1/' )
  2955.         # devise how to untar and list it
  2956.         untar=t${COMP_WORDS[1]//[^Izjyf]/}
  2957.  
  2958.         COMPREPLY=( $( compgen -W "$( echo $( tar $untar $tar \
  2959.                 2>/dev/null ) )" -- "$cur" ) )
  2960.         return 0
  2961.     fi
  2962.  
  2963.     # file completion on relevant files
  2964.     _filedir "$ext"
  2965.  
  2966.     return 0
  2967. }
  2968. [ -n "${COMP_TAR_INTERNAL_PATHS:-}" ] && complete -F _tar $dirnames tar ||
  2969.     complete -F _tar $filenames tar
  2970.  
  2971. # jar(1) completion
  2972. #
  2973. have jar &&
  2974. _jar()
  2975. {
  2976.     local cur
  2977.  
  2978.     COMPREPLY=()
  2979.     cur=`_get_cword`
  2980.  
  2981.     if [ $COMP_CWORD = 1 ]; then
  2982.         COMPREPLY=( $( compgen -W 'c t x u' -- $cur ) )
  2983.         return 0
  2984.     fi
  2985.  
  2986.     case "${COMP_WORDS[1]}" in
  2987.         *c*f)
  2988.             _filedir
  2989.             ;;
  2990.         *f)
  2991.             _filedir '?(e|j|w)ar'
  2992.             ;;
  2993.         *)
  2994.             _filedir
  2995.             ;;
  2996.     esac
  2997. } &&
  2998. complete -F _jar $filenames jar
  2999.  
  3000. # Linux iptables(8) completion
  3001. #
  3002. have iptables &&
  3003. _iptables()
  3004. {
  3005.     local cur prev table chain
  3006.  
  3007.     COMPREPLY=()
  3008.     cur=`_get_cword`
  3009.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3010.     chain='s/^Chain \([^ ]\+\).*$/\1/p'
  3011.  
  3012.     if [[ $COMP_LINE == *-t\ *filter* ]]; then
  3013.         table="-t filter"
  3014.     elif [[ $COMP_LINE == *-t\ *nat* ]]; then
  3015.         table="-t nat"
  3016.     elif [[ $COMP_LINE == *-t\ *mangle* ]]; then
  3017.         table="-t mangle"
  3018.     fi
  3019.  
  3020.     case "$prev" in
  3021.     -*[AIDRPFXLZ])
  3022.         COMPREPLY=( $( compgen -W '`iptables $table -nL | \
  3023.                 sed -ne "s/^Chain \([^ ]\+\).*$/\1/p"`' -- $cur ) )
  3024.         ;;
  3025.     -*t)
  3026.         COMPREPLY=( $( compgen -W 'nat filter mangle' -- $cur ) )
  3027.         ;;
  3028.     -j)
  3029.         if [ "$table" = "-t filter" -o "$table" = "" ]; then
  3030.             COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \
  3031.             `iptables $table -nL | sed -ne "$chain" \
  3032.             -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \
  3033.             $cur ) )
  3034.         elif [ "$table" = "-t nat" ]; then
  3035.             COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \
  3036.             MIRROR SNAT DNAT MASQUERADE `iptables $table -nL | \
  3037.             sed -ne "$chain" -e "s/OUTPUT|PREROUTING|POSTROUTING//"`' \
  3038.             -- $cur ) )
  3039.         elif [ "$table" = "-t mangle" ]; then
  3040.             COMPREPLY=( $( compgen -W 'ACCEPT DROP LOG ULOG REJECT \
  3041.             MARK TOS `iptables $table -nL | sed -ne "$chain" \
  3042.             -e "s/INPUT|OUTPUT|FORWARD|PREROUTING|POSTROUTING//"`' -- \
  3043.             $cur ) )
  3044.         fi
  3045.         ;;
  3046.     *)
  3047.         if [[ "$cur" == -* ]]; then
  3048.             COMPREPLY=( $( compgen -W '-i -o -s -d -p -f -m --append \
  3049.             --delete --insert --replace --list --flush --zero --new \
  3050.             --delete-chain --policy --rename-chain --proto --source \
  3051.             --destination --in-interface --jump --match --numeric \
  3052.             --out-interface --table --verbose --line-numbers --exact \
  3053.             --fragment --modprobe= --set-counters --version' -- "$cur") )
  3054.         fi
  3055.         ;;
  3056.     esac
  3057.  
  3058. } &&
  3059. complete -F _iptables iptables
  3060.  
  3061. # tcpdump(8) completion
  3062. #
  3063. have tcpdump &&
  3064. _tcpdump()
  3065. {
  3066.     local cur
  3067.  
  3068.     COMPREPLY=()
  3069.     cur=`_get_cword`
  3070.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3071.  
  3072.     case "$prev" in
  3073.         -@(r|w|F))
  3074.             _filedir
  3075.             return 0
  3076.             ;;
  3077.         -i)
  3078.             _available_interfaces -a
  3079.             return 0
  3080.             ;;
  3081.     esac
  3082.  
  3083.  
  3084.     if [[ "$cur" == -* ]]; then
  3085.         COMPREPLY=( $( compgen -W '-a -d -e -f -l -n -N -O -p \
  3086.             -q -R -S -t -u -v -x -C -F -i -m -r -s -T -w \
  3087.             -E' -- $cur ) )
  3088.     fi
  3089.  
  3090. } &&
  3091. complete -F _tcpdump tcpdump
  3092.  
  3093. # autorpm(8) completion
  3094. #
  3095. have autorpm &&
  3096. _autorpm()
  3097. {
  3098.     local cur
  3099.  
  3100.     COMPREPLY=()
  3101.     cur=`_get_cword`
  3102.  
  3103.     COMPREPLY=( $( compgen -W '--notty --debug --help --version \
  3104.                    auto add fullinfo info help install list \
  3105.                    remove set' -- $cur ) )
  3106.  
  3107. } &&
  3108. complete -F _autorpm autorpm
  3109.  
  3110. # This meta-cd function observes the CDPATH variable, so that cd additionally
  3111. # completes on directories under those specified in CDPATH.
  3112. #
  3113. _cd()
  3114. {
  3115.     local IFS=$'\t\n' cur=`_get_cword` i j k
  3116.  
  3117.     # try to allow variable completion
  3118.     if [[ "$cur" == ?(\\)\$* ]]; then
  3119.         COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\\)$}" ) )
  3120.         return 0
  3121.     fi
  3122.  
  3123.     # Use standard dir completion if no CDPATH or parameter starts with /,
  3124.     # ./ or ../
  3125.     if [ -z "${CDPATH:-}" ] || [[ "$cur" == ?(.)?(.)/* ]]; then
  3126.         _filedir -d
  3127.         return 0
  3128.     fi
  3129.  
  3130.     local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
  3131.     local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)
  3132.  
  3133.     # we have a CDPATH, so loop on its contents
  3134.     for i in ${CDPATH//:/$'\t'}; do
  3135.         # create an array of matched subdirs
  3136.         k="${#COMPREPLY[@]}"
  3137.         for j in $( compgen -d $i/$cur ); do
  3138.             if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
  3139.                 j="${j}/"
  3140.             fi
  3141.             COMPREPLY[k++]=${j#$i/}
  3142.         done
  3143.     done
  3144.  
  3145.     _filedir -d
  3146.  
  3147.     if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
  3148.         i=${COMPREPLY[0]}
  3149.         if [ "$i" == "$cur" ] && [[ $i != "*/" ]]; then
  3150.         COMPREPLY[0]="${i}/"
  3151.         fi
  3152.     fi
  3153.         
  3154.     return 0
  3155. }
  3156. if shopt -q cdable_vars; then
  3157.     complete -v -F _cd $nospace $filenames cd
  3158. else
  3159.     complete -F _cd $nospace $filenames cd
  3160. fi
  3161.  
  3162. _remove_comp_word()
  3163. {
  3164.     if [[ COMP_CWORD -eq 0 ]]; then
  3165.         return
  3166.     elif [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
  3167.         local old_cw0="${COMP_WORDS[0]}"
  3168.         local new_cw0="${COMP_WORDS[1]}"
  3169.         local old_length="${#COMP_LINE}"
  3170.         COMP_LINE=${COMP_LINE#${old_cw0}}
  3171.         local head=${COMP_LINE:0:${#new_cw0}}
  3172.         local i=1
  3173.         while [[ $head != $new_cw0 ]]; do
  3174.             COMP_LINE=${COMP_LINE:1}
  3175.             head=${COMP_LINE:0:${#new_cw0}}
  3176.             if (( ++i > 10 )); then
  3177.                 break
  3178.             fi
  3179.         done
  3180.         local new_length="${#COMP_LINE}"
  3181.         COMP_POINT=$(( COMP_POINT + new_length - old_length))
  3182.  
  3183.         COMP_CWORD=$(( COMP_CWORD - 1 ))
  3184.         for (( i=0; i < ${#COMP_WORDS[@]} - 1; ++i )); do
  3185.             COMP_WORDS[i]="${COMP_WORDS[i+1]}"
  3186.         done
  3187.         unset COMP_WORDS[${#COMP_WORDS[@]}-1]
  3188.     else
  3189.         return
  3190.     fi
  3191. }
  3192.  
  3193. # A meta-command completion function for commands like sudo(8), which need to
  3194. # first complete on a command, then complete according to that command's own
  3195. # completion definition - currently not quite foolproof (e.g. mount and umount
  3196. # don't work properly), but still quite useful.
  3197. #
  3198. _command()
  3199. {
  3200.     local cur func cline cspec noglob cmd done i \
  3201.           _COMMAND_FUNC _COMMAND_FUNC_ARGS
  3202.  
  3203.     _remove_comp_word
  3204.     COMPREPLY=()
  3205.     cur=`_get_cword`
  3206.     # If the the first arguments following our meta-command-invoker are
  3207.     # switches, get rid of them. Most definitely not foolproof.
  3208.     done=
  3209.     while [ -z $done ] ; do
  3210.         cmd=${COMP_WORDS[0]}
  3211.         if [[ "$cmd" == -* ]] && [ $COMP_CWORD -ge 1 ]; then
  3212.             _remove_comp_word
  3213.         elif [[ "$cmd" == -* ]] && [[ $COMP_CWORD -eq 0 ]]; then
  3214.         return
  3215.         else 
  3216.         done=1
  3217.         fi
  3218.     done
  3219.  
  3220.     if [ $COMP_CWORD -eq 0 ]; then
  3221.         COMPREPLY=( $( compgen -c -- $cur ) )
  3222.     elif complete -p $cmd &>/dev/null; then
  3223.         cspec=$( complete -p $cmd )
  3224.         if [ "${cspec#* -F }" != "$cspec" ]; then
  3225.             # COMP_CWORD and COMP_WORDS() are not read-only,
  3226.             # so we can set them before handing off to regular
  3227.             # completion routine
  3228.  
  3229.             # get function name
  3230.             func=${cspec#*-F }
  3231.             func=${func%% *}
  3232.  
  3233.             if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
  3234.                 $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"
  3235.             else
  3236.                 $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"
  3237.             fi
  3238.  
  3239.             # remove any \: generated by a command that doesn't
  3240.             # default to filenames or dirnames (e.g. sudo chown)
  3241.             # FIXME: I'm pretty sure this does not work!
  3242.             if [ "${cspec#*-o }" != "$cspec" ]; then
  3243.                 cspec=${cspec#*-o }
  3244.                 cspec=${cspec%% *}
  3245.                 if [[ "$cspec" != @(dir|file)names ]]; then
  3246.                     COMPREPLY=("${COMPREPLY[@]//\\\\:/:}")
  3247.                 fi
  3248.             fi
  3249.         elif [ -n "$cspec" ]; then
  3250.             cspec=${cspec#complete};
  3251.             cspec=${cspec%%$cmd};
  3252.             COMPREPLY=( $( eval compgen "$cspec" -- "$cur" ) );
  3253.         fi
  3254.     fi
  3255.  
  3256.     [ ${#COMPREPLY[@]} -eq 0 ] && _filedir
  3257. }
  3258. complete -F _command $filenames nohup exec nice eval strace time ltrace then \
  3259.     else do vsound command xargs
  3260.  
  3261. _root_command()
  3262. {
  3263.     PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin _command $1 $2 $3
  3264. }
  3265. complete -F _root_command $filenames sudo fakeroot really
  3266.  
  3267. # ant(1) completion
  3268. #
  3269. have ant && {
  3270. _ant()
  3271. {
  3272.     local cur prev buildfile i
  3273.  
  3274.     COMPREPLY=()
  3275.     cur=`_get_cword`
  3276.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3277.  
  3278.     case "$prev" in
  3279.         -buildfile|-f)
  3280.             _filedir 'xml'
  3281.             return 0
  3282.             ;;
  3283.         -logfile)
  3284.             _filedir
  3285.             return 0
  3286.             ;;
  3287.     esac
  3288.  
  3289.     if [[ "$cur" == -* ]]; then
  3290.         # relevant options completion
  3291.         COMPREPLY=( $( compgen -W '-help -projecthelp -version -quiet \
  3292.                    -verbose -debug -emacs -logfile -logger \
  3293.                    -listener -buildfile -f -D -find' -- $cur ) )
  3294.     else
  3295.         # available targets completion
  3296.         # find which buildfile to use
  3297.         buildfile=build.xml
  3298.         for (( i=1; i < COMP_CWORD; i++ )); do
  3299.             if [[ "${COMP_WORDS[i]}" == -buildfile ]]; then
  3300.                 buildfile=${COMP_WORDS[i+1]}
  3301.                 break
  3302.             fi
  3303.         done
  3304.         [ ! -f $buildfile ] && return 0
  3305.  
  3306.         # parse buildfile for targets
  3307.         COMPREPLY=( $( awk -F'"' '/<target name="/ {print $2}' \
  3308.                 $buildfile | grep "^$cur" )
  3309.                 $( awk -F"'" "/<target name='/ "'{print $2}' \
  3310.                 $buildfile | grep "^$cur" )
  3311.                 $( awk -F'"' '/<target [^n]/ {if ($1 ~ /name=/) { print $2 } else if ($3 ~ /name=/) {print $4} else if ($5 ~ /name=/) {print $6}}' \
  3312.                 $buildfile | grep "^$cur" ) )
  3313.     fi
  3314. }
  3315. have complete-ant-cmd.pl && \
  3316.      complete -C complete-ant-cmd.pl -F _ant $filenames ant || \
  3317.      complete -F _ant $filenames ant
  3318. }
  3319.  
  3320. have nslookup &&
  3321. _nslookup()
  3322. {
  3323.     local cur
  3324.  
  3325.     COMPREPLY=()
  3326.     cur=${COMP_WORDS[COMP_CWORD]#-}
  3327.  
  3328.     COMPREPLY=( $( compgen -P '-' -W 'all class= debug d2 domain= \
  3329.                    srchlist= defname search port= querytype= \
  3330.                    type= recurse retry root timeout vc \
  3331.                    ignoretc' -- $cur ) )
  3332. } &&
  3333. complete -F _nslookup nslookup
  3334.  
  3335. # mysqladmin(1) completion
  3336. #
  3337. have mysqladmin &&
  3338. _mysqladmin()
  3339. {
  3340.     local cur prev
  3341.  
  3342.     COMPREPLY=()
  3343.     cur=`_get_cword`
  3344.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3345.  
  3346.     case "$prev" in
  3347.     -u)
  3348.         COMPREPLY=( $( compgen -u -- $cur ) )
  3349.         return 0
  3350.         ;;
  3351.     *)
  3352.         ;;
  3353.     esac
  3354.  
  3355.     COMPREPLY=( $( compgen -W '-# -f -? -C -h -p -P -i -r -E -s -S -t -u \
  3356.                           -v -V -w' -- $cur ) )
  3357.  
  3358.     COMPREPLY=( "${COMPREPLY[@]}" \
  3359.             $( compgen -W 'create drop extended-status flush-hosts \
  3360.                    flush-logs flush-status flush-tables \
  3361.                    flush-threads flush-privileges kill \
  3362.                    password ping processlist reload refresh \
  3363.                    shutdown status variables version' \
  3364.                -- $cur ) )
  3365. } &&
  3366. complete -F _mysqladmin mysqladmin
  3367.  
  3368. # gzip(1) completion
  3369. #
  3370. have gzip &&
  3371. _gzip()
  3372. {
  3373.     local cur prev xspec IFS=$'\t\n'
  3374.  
  3375.     COMPREPLY=()
  3376.     cur=`_get_cword`
  3377.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3378.  
  3379.     if [[ "$cur" == -* ]]; then
  3380.         COMPREPLY=( $( compgen -W '-c -d -f \
  3381.             -h -l -L -n -N -q -r -S -t -v -V \
  3382.             -1 -2 -3 -4 -5 -6 -7 -8 -9 \
  3383.             --stdout --decompress --force --help --list \
  3384.             --license --no-name --name --quiet --recursive \
  3385.             --suffix --test --verbose --version --fast \
  3386.             --best' -- $cur ) )
  3387.         return 0
  3388.     fi
  3389.  
  3390.     xspec="*.?(t)gz"
  3391.     if [[ "$prev" == --* ]]; then
  3392.         [[ "$prev" == --decompress || \
  3393.             "$prev" == --list || \
  3394.             "$prev" == --test ]] && xspec="!"$xspec
  3395.         [[ "$prev" == --force ]] && xspec=
  3396.     elif [[ "$prev" == -* ]]; then
  3397.         [[ "$prev" == -*[dlt]* ]] && xspec="!"$xspec
  3398.         [[ "$prev" == -*f* ]] && xspec=
  3399.     elif [ "$prev" = '>' ]; then
  3400.         xspec=
  3401.     elif [ "$prev" = '<' ]; then
  3402.         xspec=
  3403.     fi
  3404.  
  3405.     _expand || return 0
  3406.  
  3407.     COMPREPLY=( $( compgen -f -X "$xspec" -- $cur ) \
  3408.             $( compgen -d -- $cur ) )
  3409. } &&
  3410. complete -F _gzip $filenames gzip
  3411.  
  3412. # bzip2(1) completion
  3413. #
  3414. have bzip2 &&
  3415. _bzip2()
  3416. {
  3417.     local cur prev xspec IFS=$'\t\n'
  3418.  
  3419.     COMPREPLY=()
  3420.     cur=`_get_cword`
  3421.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3422.  
  3423.     if [[ "$cur" == -* ]]; then
  3424.         COMPREPLY=( $( compgen -W '-c -d -f -h -k -L -q -s \
  3425.             -t -v -V -z -1 -2 -3 -4 -5 -6 -7 -8 -9 \
  3426.             --help --decompress --compress --keep --force \
  3427.             --test --stdout --quiet --verbose --license \
  3428.             --version --small --fast --best' -- $cur ) )
  3429.         return 0
  3430.     fi
  3431.  
  3432.     xspec="*.bz2"
  3433.     if [[ "$prev" == --* ]]; then
  3434.         [[ "$prev" == --decompress || \
  3435.             "$prev" == --list || \
  3436.             "$prev" == --test ]] && xspec="!"$xspec
  3437.         [[ "$prev" == --compress ]] && xspec=
  3438.     elif [[ "$prev" == -* ]]; then
  3439.         [[ "$prev" == -*[dt]* ]] && xspec="!"$xspec
  3440.         [[ "$prev" == -*z* ]] && xspec=
  3441.     fi
  3442.  
  3443.     _expand || return 0
  3444.  
  3445.     COMPREPLY=( $( compgen -f -X "$xspec" -- $cur ) \
  3446.             $( compgen -d -- $cur ) )
  3447. } &&
  3448. complete -F _bzip2 $filenames bzip2
  3449.  
  3450. # openssl(1) completion
  3451. #
  3452. have openssl && {
  3453. _openssl_sections()
  3454. {
  3455.     local config
  3456.  
  3457.     config=/etc/ssl/openssl.cnf
  3458.     [ ! -f $config ] && config=/usr/share/ssl/openssl.cnf
  3459.     for (( i=2; i < COMP_CWORD; i++ )); do
  3460.         if [[ "${COMP_WORDS[i]}" == -config ]]; then
  3461.             config=${COMP_WORDS[i+1]}
  3462.             break
  3463.         fi
  3464.     done
  3465.     [ ! -f $config ] && return 0
  3466.  
  3467.     COMPREPLY=( $( awk '/\[.*\]/ {print $2} ' $config | grep "^$cur" ) )
  3468. }
  3469.  
  3470. _openssl()
  3471. {
  3472.     local cur prev
  3473.  
  3474.     COMPREPLY=()
  3475.     cur=`_get_cword`
  3476.  
  3477.     if [ $COMP_CWORD -eq 1 ]; then
  3478.         COMPREPLY=( $( compgen -W 'asn1parse ca ciphers crl crl2pkcs7 \
  3479.             dgst dh dhparam dsa dsaparam enc errstr gendh gendsa \
  3480.             genrsa nseq passwd pkcs12 pkcs7 pkcs8 rand req rsa \
  3481.             rsautl s_client s_server s_time sess_id smime speed \
  3482.             spkac verify version x509 md2 md4 md5 mdc2 rmd160 sha \
  3483.             sha1 base64 bf bf-cbc bf-cfb bf-ecb bf-ofb cast \
  3484.             cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des \
  3485.             des-cbc des-cfb des-ecb des-ede des-ede-cbc \
  3486.             des-ede-cfb des-ede-ofb des-ede3 des-ede3-cbc \
  3487.             des-ede3-cfb des-ede3-ofb des-ofb des3 desx rc2 \
  3488.             rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb \
  3489.             rc4 rc4-40' -- $cur ) )
  3490.     else
  3491.         prev=${COMP_WORDS[COMP_CWORD-1]}
  3492.         case ${COMP_WORDS[1]} in
  3493.             asn1parse)
  3494.                 case $prev in
  3495.                     -inform)
  3496.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3497.                         return 0
  3498.                         ;;
  3499.                     -@(in|out|oid))
  3500.                         _filedir
  3501.                         return 0
  3502.                         ;;
  3503.                     esac
  3504.  
  3505.                 if [[ "$cur" == -* ]]; then
  3506.                     COMPREPLY=( $( compgen -W '-inform -in -out -noout -offset \
  3507.                         -length -i -oid -strparse' -- $cur ) )
  3508.                 fi
  3509.                 ;;
  3510.             ca)
  3511.                 case $prev in
  3512.                     -@(config|revoke|cert|in|out|spkac|ss_cert))
  3513.                         _filedir
  3514.                         return 0
  3515.                         ;;
  3516.                     -outdir)
  3517.                         _filedir -d
  3518.                         return 0
  3519.                         ;;
  3520.                     -@(name|crlexts|extensions))
  3521.                         _openssl_sections
  3522.                         return 0
  3523.                         ;;
  3524.                 esac
  3525.  
  3526.                 if [[ "$cur" == -* ]]; then
  3527.                     COMPREPLY=( $( compgen -W '-verbose -config -name \
  3528.                         -gencrl -revoke -crldays -crlhours -crlexts \
  3529.                         -startdate -enddate -days -md -policy -keyfile \
  3530.                         -key -passin -cert -in -out -notext -outdir \
  3531.                         -infiles -spkac -ss_cert -preserveDN -batch \
  3532.                         -msie_hack -extensions' -- $cur ) )
  3533.                 fi
  3534.                 ;;
  3535.             ciphers)
  3536.                 if [[ "$cur" == -* ]]; then
  3537.                     COMPREPLY=( $( compgen -W '-v -ssl2 -ssl3 -tls1' -- $cur ) )
  3538.                 fi
  3539.                 ;;
  3540.             crl)
  3541.                 case $prev in
  3542.                     -@(in|out)form)
  3543.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3544.                         return 0
  3545.                         ;;
  3546.                     -@(in|out|CAfile))
  3547.                         _filedir
  3548.                         return 0
  3549.                         ;;
  3550.                     -CAPath)
  3551.                         _filedir -d
  3552.                         return 0
  3553.                         ;;
  3554.                 esac
  3555.  
  3556.                 if [[ "$cur" == -* ]]; then
  3557.                     COMPREPLY=( $( compgen -W '-inform -outform -text -in -out -noout \
  3558.                         -hash -issuer -lastupdate -nextupdate -CAfile -CApath' -- $cur ) )
  3559.                 fi
  3560.                 ;;
  3561.             crl2pkcs7)
  3562.                 case $prev in
  3563.                     -@(in|out)form)
  3564.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3565.                         return 0
  3566.                         ;;
  3567.                     -@(in|out))
  3568.                         _filedir
  3569.                         return 0
  3570.                         ;;
  3571.                 esac
  3572.  
  3573.                 if [[ "$cur" == -* ]]; then
  3574.                     COMPREPLY=( $( compgen -W '-inform -outform -in -out -print_certs' -- $cur ) )
  3575.                 fi
  3576.                 ;;
  3577.             dgst)
  3578.                 case $prev in
  3579.                     -@(out|sign|verify|prvrify|signature))
  3580.                         _filedir
  3581.                         return 0
  3582.                         ;;
  3583.                 esac
  3584.  
  3585.                 if [[ "$cur" == -* ]]; then
  3586.                     COMPREPLY=( $( compgen -W '-md5 -md4 -md2 -sha1 -sha -mdc2 -ripemd160 -dss1 \
  3587.                         -c -d -hex -binary -out -sign -verify -prverify -signature' -- $cur ) )
  3588.                 else
  3589.                         _filedir
  3590.                 fi
  3591.                    ;;
  3592.             dsa)
  3593.                 case $prev in
  3594.                     -@(in|out)form)
  3595.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3596.                         return 0
  3597.                         ;;
  3598.                     -@(in|out))
  3599.                         _filedir
  3600.                         return 0
  3601.                         ;;
  3602.                 esac
  3603.  
  3604.                 if [[ "$cur" == -* ]]; then
  3605.                     COMPREPLY=( $( compgen -W '-inform -outform -in -passin -out -passout -des -des3 -idea -text -noout \
  3606.                         -modulus -pubin -pubout' -- $cur ) )
  3607.                 fi
  3608.                 ;;
  3609.             dsaparam)
  3610.                 case $prev in
  3611.                     -@(in|out)form)
  3612.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3613.                         return 0
  3614.                         ;;
  3615.                     -@(in|out|rand))
  3616.                         _filedir
  3617.                         return 0
  3618.                         ;;
  3619.                 esac
  3620.  
  3621.                 if [[ "$cur" == -* ]]; then
  3622.                     COMPREPLY=( $( compgen -W '-inform -outform -in -out -noout \
  3623.                         -text -C -rand -genkey' -- $cur ) )
  3624.                 fi
  3625.                 ;;
  3626.             enc)
  3627.                 case $prev in
  3628.                     -@(in|out|kfile))
  3629.                         _filedir
  3630.                         return 0
  3631.                         ;;
  3632.                 esac
  3633.  
  3634.                 if [[ "$cur" == -* ]]; then
  3635.                     COMPREPLY=( $( compgen -W '-ciphername -in -out -pass \
  3636.                         -e -d -a -A -k -kfile -S -K -iv -p -P -bufsize -debug' -- $cur ) )
  3637.                 fi
  3638.                 ;;
  3639.             dhparam)
  3640.                 case $prev in
  3641.                     -@(in|out)form)
  3642.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3643.                         return 0
  3644.                         ;;
  3645.                     -@(in|out|rand))
  3646.                         _filedir
  3647.                         return 0
  3648.                         ;;
  3649.                 esac
  3650.  
  3651.                 if [[ "$cur" == -* ]]; then
  3652.                     COMPREPLY=( $( compgen -W '-inform -outform -in -out -dsaparam -noout \
  3653.                         -text -C -2 -5 -rand' -- $cur ) )
  3654.                 fi
  3655.                 ;;
  3656.             gendsa)
  3657.                 case $prev in
  3658.                     -@(out|rand))
  3659.                         _filedir
  3660.                         return 0
  3661.                         ;;
  3662.                 esac
  3663.  
  3664.                 if [[ "$cur" == -* ]]; then
  3665.                     COMPREPLY=( $( compgen -W '-out -des -des3 -idea -rand' -- $cur ) )
  3666.                 else
  3667.                         _filedir
  3668.                 fi
  3669.                 ;;
  3670.             genrsa)
  3671.                 case $prev in
  3672.                     -@(out|rand))
  3673.                         _filedir
  3674.                         return 0
  3675.                         ;;
  3676.                 esac
  3677.  
  3678.                 if [[ "$cur" == -* ]]; then
  3679.                     COMPREPLY=( $( compgen -W '-out -passout -des -des3 -idea -f4 -3 -rand' -- $cur ) )
  3680.                 fi
  3681.                 ;;
  3682.             pkcs7)
  3683.                 case $prev in
  3684.                     -@(in|out)form)
  3685.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3686.                         return 0
  3687.                         ;;
  3688.                     -@(in|out))
  3689.                         _filedir
  3690.                         return 0
  3691.                         ;;
  3692.                 esac
  3693.  
  3694.                 if [[ "$cur" == -* ]]; then
  3695.                     COMPREPLY=( $( compgen -W '-inform -outform -in -out -print_certs -text -noout' -- $cur ) )
  3696.                 fi
  3697.                 ;;
  3698.             rand)
  3699.                 case $prev in
  3700.                     -@(out|rand))
  3701.                         _filedir
  3702.                         return 0
  3703.                         ;;
  3704.                 esac
  3705.  
  3706.                 if [[ "$cur" == -* ]]; then
  3707.                     COMPREPLY=( $( compgen -W '-out -rand -base64' -- $cur ) )
  3708.                 fi
  3709.                 ;;
  3710.             req)
  3711.                 case "$prev" in
  3712.                     -@(in|out|key)form)
  3713.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3714.                         return 0
  3715.                         ;;
  3716.  
  3717.                     -@(in|out|rand|key|keyout|config))
  3718.                         _filedir
  3719.                         return 0
  3720.                         ;;
  3721.                     -extensions)
  3722.                         _openssl_sections
  3723.                         return 0
  3724.                         ;;
  3725.                 esac
  3726.  
  3727.                 if [[ "$cur" == -* ]]; then
  3728.                     COMPREPLY=( $( compgen -W '-inform -outform -in \
  3729.                         -passin -out -passout -text -noout -verify \
  3730.                         -modulus -new -rand -newkey -newkey -nodes \
  3731.                         -key -keyform -keyout -md5 -sha1 -md2 -mdc2 \
  3732.                         -config -x509 -days -asn1-kludge -newhdr \
  3733.                         -extensions -reqexts section' -- $cur ) )
  3734.                 fi
  3735.                 ;;
  3736.             rsa)
  3737.                 case $prev in
  3738.                     -@(in|out)form)
  3739.                         COMPREPLY=( $( compgen -W 'DER NET PEM' -- $cur ) )
  3740.                         return 0
  3741.                         ;;
  3742.                     -@(in|out))
  3743.                         _filedir
  3744.                         return 0
  3745.                         ;;
  3746.                 esac
  3747.  
  3748.                 if [[ "$cur" == -* ]]; then
  3749.                     COMPREPLY=( $( compgen -W '-inform -outform -in -passin -out -passout \
  3750.                         -sgckey -des -des3 -idea -text -noout -modulus -check -pubin \
  3751.                         -pubout -engine' -- $cur ) )
  3752.                 fi
  3753.                 ;;
  3754.             rsautl)
  3755.                 case $prev in
  3756.                     -@(in|out|inkey))
  3757.                         _filedir
  3758.                         return 0
  3759.                         ;;
  3760.                 esac
  3761.  
  3762.                 if [[ "$cur" == -* ]]; then
  3763.                     COMPREPLY=( $( compgen -W '-in -out -inkey -pubin -certin -sign -verify \
  3764.                         -encrypt -decrypt -pkcs -ssl -raw -hexdump -asn1parse' -- $cur ) )
  3765.                 fi
  3766.                 ;;
  3767.             s_client)
  3768.                 case $prev in
  3769.                     -connect)
  3770.                         _known_hosts
  3771.                         return 0
  3772.                         ;;
  3773.                     -@(cert|key|CAfile|rand))
  3774.                         _filedir
  3775.                         return 0
  3776.                         ;;
  3777.                     -CApath)
  3778.                         _filedir -d
  3779.                         return 0
  3780.                         ;;
  3781.                 esac
  3782.  
  3783.                 if [[ "$cur" == -* ]]; then
  3784.                     COMPREPLY=( $( compgen -W '-connect -verify -cert -key -CApath -CAfile \
  3785.                         -reconnect -pause -showcerts -debug -msg -nbio_test -state -nbio \
  3786.                         -crlf -ign_eof -quiet -ssl2 -ssl3 -tls1 -no_ssl2 -no_ssl3 -no_tls1 \
  3787.                         -bugs -cipher -starttls -engine -rand' -- $cur ) )
  3788.                 fi
  3789.                 ;;
  3790.             s_server)
  3791.                 case $prev in
  3792.                     -@(cert|key|dcert|dkey|dhparam|CAfile|rand))
  3793.                         _filedir
  3794.                         return 0
  3795.                         ;;
  3796.                     -CApath)
  3797.                         _filedir -d
  3798.                         return 0
  3799.                         ;;
  3800.                 esac
  3801.  
  3802.                 if [[ "$cur" == -* ]]; then
  3803.                     COMPREPLY=( $( compgen -W '-accept -context -verify -Verify -cert -key \
  3804.                          -dcert -dkey -dhparam -nbio -nbio_test -crlf -debug -msg -state -CApath \
  3805.                          -CAfile -nocert -cipher -quiet -no_tmp_rsa -ssl2 -ssl3 -tls1 -no_ssl2 \
  3806.                          -no_ssl3 -no_tls1 -no_dhe -bugs -hack -www -WWW -HTTP -engine -id_prefix \
  3807.                          -rand' -- $cur ) )
  3808.                  fi
  3809.                  ;;
  3810.             s_time)
  3811.                 case $prev in
  3812.                     -connect)
  3813.                         _known_hosts
  3814.                         return 0
  3815.                         ;;
  3816.                     -@(cert|key|CAfile))
  3817.                         _filedir
  3818.                         return 0
  3819.                         ;;
  3820.                     -CApath)
  3821.                         _filedir -d
  3822.                         return 0
  3823.                         ;;
  3824.                 esac
  3825.  
  3826.                 if [[ "$cur" == -* ]]; then
  3827.                     COMPREPLY=( $( compgen -W '-connect -www -cert -key -CApath -CAfile -reuse \
  3828.                         -new -verify -nbio -time -ssl2 -ssl3 -bugs -cipher' -- $cur ) )
  3829.                 fi
  3830.                 ;;
  3831.  
  3832.             sess_id) 
  3833.                 case $prev in
  3834.                     -@(in|out)form)
  3835.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3836.                         return 0
  3837.                         ;;
  3838.                     -@(in|out))
  3839.                         _filedir
  3840.                         return 0
  3841.                         ;;
  3842.                 esac
  3843.  
  3844.  
  3845.                 if [[ "$cur" == -* ]]; then
  3846.                     COMPREPLY=( $( compgen -W '-inform -outform -in -out -text -noout \
  3847.                         -context ID' -- $cur ) )
  3848.                 fi
  3849.                 ;;
  3850.             smime)
  3851.                 case $prev in
  3852.                     -@(in|out)form)
  3853.                         COMPREPLY=( $( compgen -W 'SMIME DER PEM' -- $cur ) )
  3854.                         return 0
  3855.                         ;;
  3856.                     -@(in|out|certfile|signer|recip|inkey|content|rand))
  3857.                         _filedir
  3858.                         return 0
  3859.                         ;;
  3860.                 esac
  3861.  
  3862.                 if [[ "$cur" == -* ]]; then
  3863.                     COMPREPLY=( $( compgen -W '-encrypt -decrypt -sign -verify -pk7out -des -des3 \
  3864.                         -rc2-40 -rc2-64 -rc2-128 -aes128 -aes192 -aes256 -in -certfile -signer \
  3865.                         -recip -inform -passin -inkey -out -outform -content -to -from -subject \
  3866.                         -text -rand' -- $cur ) )
  3867.                 else
  3868.                         _filedir
  3869.                 fi
  3870.                 ;;
  3871.             speed)
  3872.                 if [[ "$cur" == -* ]]; then
  3873.                     COMPREPLY=( $( compgen -W '-engine' -- $cur ) )
  3874.                 else
  3875.                     COMPREPLY=( $( compgen -W 'md2 mdc2 md5 hmac sha1 rmd160 idea-cbc \
  3876.                         rc2-cbc rc5-cbc bf-cbc des-cbc des-ede3 rc4 rsa512 rsa1024 rsa2048 \
  3877.                         rsa4096 dsa512 dsa1024 dsa2048 idea rc2 des rsa blowfish' -- $cur ) )
  3878.                 fi
  3879.                 ;;
  3880.             verify)
  3881.                 case $prev in
  3882.                     -@(CAfile|untrusted))
  3883.                         _filedir
  3884.                         return 0
  3885.                         ;;
  3886.                     -CApath)
  3887.                         _filedir -d
  3888.                         return 0
  3889.                         ;;
  3890.                 esac
  3891.  
  3892.                 if [[ "$cur" == -* ]]; then
  3893.                     COMPREPLY=( $( compgen -W '-CApath -CAfile -purpose -untrusted -help -issuer_checks \
  3894.                         -verbose -certificates' -- $cur ) )
  3895.                 else
  3896.                         _filedir
  3897.                 fi
  3898.                 ;;
  3899.             x509)
  3900.                 case "$prev" in
  3901.                     -@(in|out|CA|CAkey|CAserial|extfile))
  3902.                         _filedir
  3903.                         return 0
  3904.                         ;;
  3905.                     -@(in|out)form)
  3906.                         COMPREPLY=( $( compgen -W 'DER PEM NET' -- $cur ) )
  3907.                         return 0
  3908.                         ;;
  3909.                     -@(key|CA|CAkey)form)
  3910.                         COMPREPLY=( $( compgen -W 'DER PEM' -- $cur ) )
  3911.                         return 0
  3912.                         ;;
  3913.                     -extensions)
  3914.                         _openssl_sections
  3915.                         return 0
  3916.                         ;;
  3917.                 esac
  3918.  
  3919.                 if [[ "$cur" == -* ]]; then
  3920.                     COMPREPLY=( $( compgen -W '-inform -outform \
  3921.                         -keyform -CAform -CAkeyform -in -out \
  3922.                         -serial -hash -subject -issuer -nameopt \
  3923.                         -email -startdate -enddate -purpose \
  3924.                         -dates -modulus -fingerprint -alias \
  3925.                         -noout -trustout -clrtrust -clrreject \
  3926.                         -addtrust -addreject -setalias -days \
  3927.                         -set_serial -signkey -x509toreq -req \
  3928.                         -CA -CAkey -CAcreateserial -CAserial \
  3929.                         -text -C -md2 -md5 -sha1 -mdc2 -clrext \
  3930.                         -extfile -extensions -engine' -- $cur ) )
  3931.                 fi
  3932.                 ;;
  3933.             @(md5|md4|md2|sha1|sha|mdc2|ripemd160))
  3934.                 if [[ "$cur" == -* ]]; then
  3935.                     COMPREPLY=( $( compgen -W '-c -d' -- $cur ) )
  3936.                 else
  3937.                         _filedir
  3938.                 fi
  3939.                 ;;
  3940.         esac
  3941.     fi
  3942.  
  3943.     return 0
  3944. }
  3945. complete -F _openssl $default openssl
  3946. }
  3947.  
  3948. # screen(1) completion
  3949. #
  3950. have screen &&
  3951. _screen()
  3952. {
  3953.     local cur prev preprev
  3954.  
  3955.     COMPREPLY=()
  3956.     cur=`_get_cword`
  3957.     prev=${COMP_WORDS[COMP_CWORD-1]}
  3958.  
  3959.     [ "$COMP_CWORD" -ge 2 ] && preprev=${COMP_WORDS[COMP_CWORD-2]}
  3960.  
  3961.     if [ "$preprev" = "-d" -o "$preprev" = "-D" -a "$prev" = "-r" -o \
  3962.          "$prev" = "-R" ]; then
  3963.         # list all
  3964.         COMPREPLY=( $( command screen -ls | \
  3965.                 sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*$|\1|p' ) )
  3966.     else
  3967.         case "$prev" in
  3968.         -[rR])
  3969.             # list detached
  3970.             COMPREPLY=( $( command screen -ls | \
  3971.                     sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*Detached.*$|\1|p' ) )
  3972.             ;;
  3973.         -[dDx])
  3974.             # list attached
  3975.             COMPREPLY=( $( command screen -ls | \
  3976.                     sed -ne 's|^['$'\t'']\+\('$cur'[0-9]\+\.[^'$'\t'']\+\).*Attached.*$|\1|p' ) )
  3977.             ;;
  3978.         -s)
  3979.             # shells
  3980.             COMPREPLY=( $( grep ^${cur:-[^#]} /etc/shells ) )
  3981.             ;;
  3982.         *)
  3983.             ;;
  3984.         esac
  3985.     fi
  3986.  
  3987.     return 0
  3988. } &&
  3989. complete -F _screen $default screen
  3990.  
  3991. # lftp(1) bookmark completion
  3992. #
  3993. have lftp &&
  3994. _lftp()
  3995. {
  3996.     local cur
  3997.  
  3998.     COMPREPLY=()
  3999.     cur=`_get_cword`
  4000.  
  4001.     if [ $COMP_CWORD -eq 1 ] && [ -f ~/.lftp/bookmarks ]; then
  4002.         COMPREPLY=( $( compgen -W '$( sed -ne "s/^\(.*\)'$'\t''.*$/\1/p" \
  4003.                ~/.lftp/bookmarks )' -- $cur ) )
  4004.     fi
  4005.  
  4006.     return 0
  4007. } &&
  4008. complete -F _lftp $default lftp
  4009.  
  4010. # ncftp(1) bookmark completion
  4011. #
  4012. have ncftp &&
  4013. _ncftp()
  4014. {
  4015.     local cur
  4016.  
  4017.     COMPREPLY=()
  4018.     cur=`_get_cword`
  4019.  
  4020.     if [ $COMP_CWORD -eq 1 ] && [ -f ~/.ncftp/bookmarks ]; then
  4021.         COMPREPLY=( $( compgen -W '$( sed -ne "s/^\([^,]\{1,\}\),.*$/\1/p" \
  4022.                ~/.ncftp/bookmarks )' -- $cur ) )
  4023.     fi
  4024.  
  4025.     return 0
  4026. } &&
  4027. complete -F _ncftp $default ncftp
  4028.  
  4029. # gdb(1) completion
  4030. #
  4031. have gdb &&
  4032. _gdb()
  4033. {
  4034.     local cur prev
  4035.  
  4036.     COMPREPLY=()
  4037.     cur=`_get_cword`
  4038.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4039.  
  4040.     if [ $COMP_CWORD -eq 1 ]; then
  4041.         COMPREPLY=( $( compgen -c -- $cur ) )
  4042.     elif [ $COMP_CWORD -eq 2 ]; then
  4043.         prev=${prev##*/}
  4044.         COMPREPLY=( $( compgen -fW "$( command ps axo comm,pid | \
  4045.                 awk '{if ($1 ~ /^'"$prev"'/) print $2}' ) )" \
  4046.                 -- "$cur" ) )
  4047.     fi
  4048. } &&
  4049. complete -F _gdb $filenames gdb
  4050.  
  4051. # Postgresql completion
  4052. #
  4053. have psql && {
  4054. _pg_databases() 
  4055. {
  4056.     return
  4057.     COMPREPLY=( $( psql -l 2>/dev/null | \
  4058.             sed -e '1,/^-/d' -e '/^(/,$d' | \
  4059.             awk '{print $1}' | grep "^$cur" ) )
  4060. }
  4061.  
  4062. _pg_users()
  4063. {
  4064.     #COMPREPLY=( $( psql -qtc 'select usename from pg_user' template1 2>/dev/null | \
  4065.     #        grep "^ $cur" ) )
  4066.     #[ ${#COMPREPLY[@]} -eq 0 ] &&
  4067.     COMPREPLY=( $( compgen -u -- $cur ) )
  4068. }
  4069.  
  4070. # createdb(1) completion
  4071. #
  4072. _createdb() 
  4073. {
  4074.     local cur prev
  4075.  
  4076.     COMPREPLY=()
  4077.     cur=`_get_cword`
  4078.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4079.  
  4080.     case "$prev" in
  4081.     -@(h|-host=)) 
  4082.         _known_hosts
  4083.         return 0
  4084.         ;;
  4085.     -@(U|-username=))
  4086.         _pg_users
  4087.         return 0
  4088.         ;;
  4089.     esac
  4090.  
  4091.     if [[ "$cur" == -* ]]; then
  4092.         COMPREPLY=( $( compgen -W '-D -T -E -h -p -U -W -e -q \
  4093.             --location= --template= --encoding= --host= --port= \
  4094.             --username= --password --echo --quiet --help' -- $cur ))
  4095.     else
  4096.         _pg_databases
  4097.     fi
  4098. }
  4099. complete -F _createdb $default createdb
  4100.  
  4101. # dropdb(1) completion
  4102. #
  4103. _dropdb() 
  4104. {
  4105.     local cur prev
  4106.  
  4107.     COMPREPLY=()
  4108.     cur=`_get_cword`
  4109.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4110.  
  4111.     case "$prev" in
  4112.     -@(h|-host=)) 
  4113.         _known_hosts
  4114.         return 0
  4115.         ;;
  4116.     -@(U|-username=))
  4117.         _pg_users
  4118.         return 0
  4119.         ;;
  4120.     esac
  4121.  
  4122.     if [[ "$cur" == -* ]]; then
  4123.         COMPREPLY=( $( compgen -W '-h -p -U -W -e -q \
  4124.                 --host= --port= --username= --password \
  4125.                 --interactive --echo --quiet --help' -- $cur ) )
  4126.     else
  4127.         _pg_databases
  4128.     fi
  4129. }
  4130. complete -F _dropdb $default dropdb
  4131.  
  4132. # psql(1) completion
  4133. #
  4134. _psql() 
  4135. {
  4136.     local cur prev
  4137.  
  4138.     COMPREPLY=()
  4139.     cur=`_get_cword`
  4140.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4141.  
  4142.     case "$prev" in
  4143.     -h|--host) 
  4144.         _known_hosts
  4145.         return 0
  4146.         ;;
  4147.     -U|--username)
  4148.         _pg_users
  4149.         return 0
  4150.         ;;
  4151.     -d|--dbname)
  4152.         _pg_databases
  4153.         return 0
  4154.         ;;
  4155.     -@(o|f)|--output|--file)
  4156.         _filedir
  4157.         return 0
  4158.         ;;
  4159.     esac
  4160.  
  4161.     if [[ "$cur" == -* ]]; then
  4162.         # return list of available options
  4163.         COMPREPLY=( $( compgen -W '-a --echo-all -A --no-align \
  4164.             -c --command -d --dbname -e --echo-queries \
  4165.             -E --echo-hidden -f --file -F --filed-separator \
  4166.             -h --host -H --html -l --list -n -o --output \
  4167.             -p --port -P --pset -q -R --record-separator \
  4168.             -s --single-step -S --single-line -t --tuples-only \
  4169.             -T --table-attr -U --username -v --variable \
  4170.             -V --version -W --password -x --expanded -X --nopsqlrc \
  4171.             -? --help ' -- $cur ) )
  4172.     else
  4173.         # return list of available databases
  4174.         _pg_databases
  4175.     fi
  4176. }
  4177. complete -F _psql $default psql
  4178. }
  4179.  
  4180. _longopt()
  4181. {
  4182.     local cur opt
  4183.  
  4184.     cur=`_get_cword`
  4185.  
  4186.     if [[ "$cur" == --*=* ]]; then
  4187.         opt=${cur%%=*}
  4188.         # cut backslash that gets inserted before '=' sign
  4189.         opt=${opt%\\*}
  4190.         cur=${cur#*=}
  4191.         _filedir
  4192.         COMPREPLY=( $( compgen -P "$opt=" -W '${COMPREPLY[@]}' -- $cur))
  4193.         return 0
  4194.     fi
  4195.  
  4196.     if [[ "$cur" == -* ]]; then
  4197.         COMPREPLY=( $( $1 --help 2>&1 | sed -e '/--/!d' \
  4198.                 -e 's/.*\(--[-A-Za-z0-9]\+=\?\).*/\1/' | \
  4199.                    command grep "^$cur" | sort -u ) )
  4200.     elif [[ "$1" == @(mk|rm)dir ]]; then
  4201.         _filedir -d
  4202.     else
  4203.         _filedir
  4204.     fi
  4205. }
  4206. # makeinfo and texi2dvi are defined elsewhere.
  4207. for i in a2ps autoconf automake bc gprof ld nm objcopy objdump readelf strip \
  4208.      bison cpio diff patch enscript cp df dir du ln ls mkfifo mknod mv rm \
  4209.      touch vdir awk gperf grep grub indent less m4 sed shar date \
  4210.      tee who texindex cat csplit cut expand fmt fold head \
  4211.      md5sum nl od paste pr ptx sha1sum sort split tac tail tr unexpand \
  4212.      uniq wc ldd bash id irb mkdir rmdir; do
  4213.   have $i && complete -F _longopt $filenames $i
  4214. done
  4215.  
  4216. # These commands use filenames, so '-o filenames' is not needed.
  4217. for i in env netstat seq uname units wget; do
  4218.   have $i && complete -F _longopt $default $i
  4219. done
  4220. unset i
  4221.  
  4222. # gcc(1) completion
  4223. #
  4224. # The only unusual feature is that we don't parse "gcc --help -v" output
  4225. # directly, because that would include the options of all the other backend
  4226. # tools (linker, assembler, preprocessor, etc) without any indication that
  4227. # you cannot feed such options to the gcc driver directly.  (For example, the
  4228. # linker takes a -z option, but you must type -Wl,-z for gcc.)  Instead, we
  4229. # ask the driver ("g++") for the name of the compiler ("cc1"), and parse the
  4230. # --help output of the compiler.
  4231. #
  4232. have gcc &&
  4233. _gcc()
  4234. {
  4235.     local cur cc backend
  4236.  
  4237.     COMPREPLY=()
  4238.     cur=`_get_cword`
  4239.  
  4240.     _expand || return 0
  4241.  
  4242.     case "$1" in
  4243.     gcj)
  4244.         backend=jc1
  4245.         ;;
  4246.     gpc)
  4247.         backend=gpc1
  4248.         ;;
  4249.     *77)
  4250.         backend=f771
  4251.         ;;
  4252.     *)
  4253.         backend=cc1    # (near-)universal backend
  4254.         ;;
  4255.     esac
  4256.  
  4257.     if [[ "$cur" == -* ]]; then
  4258.         cc=$( $1 -print-prog-name=$backend )
  4259.         # sink stderr:
  4260.         # for C/C++/ObjectiveC it's useless
  4261.         # for FORTRAN/Java it's an error
  4262.         COMPREPLY=( $( $cc --help 2>/dev/null | tr '\t' ' ' | \
  4263.                    sed -e '/^  *-/!d' -e 's/ *-\([^ ]*\).*/-\1/' | \
  4264.                    command grep "^$cur" | sort -u ) )
  4265.     else
  4266.         _filedir
  4267.     fi
  4268. } &&
  4269. complete $filenames -F _gcc gcc g++ c++ g77 gcj gpc
  4270. [ $UNAME = GNU -o $UNAME = Linux -o $UNAME = Cygwin ] && \
  4271. [ -n "${have:-}" ] && complete $filenames -F _gcc cc
  4272.  
  4273. # Linux cardctl(8) completion
  4274. #
  4275. have cardctl &&
  4276. _cardctl()
  4277. {
  4278.     local cur
  4279.  
  4280.     COMPREPLY=()
  4281.     cur=`_get_cword`
  4282.  
  4283.     if [ $COMP_CWORD -eq 1 ]; then
  4284.         COMPREPLY=( $( compgen -W 'status config ident suspend \
  4285.                        resume reset eject insert scheme' \
  4286.                    -- $cur ) )
  4287.     fi
  4288. } &&
  4289. complete -F _cardctl cardctl
  4290.  
  4291. # This function is required by _dpkg() and _dpkg-reconfigure()
  4292. #
  4293. have dpkg && {
  4294. _comp_dpkg_installed_packages()
  4295. {
  4296.     grep -A 1 "Package: $1" /var/lib/dpkg/status | \
  4297.         grep -B 1 -E "ok installed|half-installed|unpacked| \
  4298.                          half-configured|config-files" | \
  4299.             grep "Package: $1" | cut -d\  -f2
  4300. }
  4301.  
  4302. # Debian dpkg(8) completion
  4303. #
  4304. _dpkg()
  4305. {
  4306.     local cur prev i
  4307.  
  4308.     COMPREPLY=()
  4309.     cur=`_get_cword`
  4310.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4311.     i=$COMP_CWORD
  4312.  
  4313.     _expand || return 0
  4314.  
  4315.     # find the last option flag
  4316.     if [[ $cur != -* ]]; then
  4317.         while [[ $prev != -* && $i != 1 ]]; do
  4318.             i=$((i-1))
  4319.             prev=${COMP_WORDS[i-1]}
  4320.         done
  4321.     fi
  4322.  
  4323.     case "$prev" in 
  4324.     -@(c|i|A|I|f|e|x|X|-@(install|unpack|record-avail|contents|info|fsys-tarfile|field|control|extract)))
  4325.         _filedir '?(u)deb'
  4326.         return 0
  4327.         ;;
  4328.     -@(b|-build))
  4329.         _filedir -d
  4330.         return 0
  4331.         ;;
  4332.        -@(s|p|l|-@(status|print-avail|list)))
  4333.         COMPREPLY=( $( apt-cache pkgnames $cur 2>/dev/null ) )
  4334.         return 0
  4335.         ;;
  4336.     -@(S|-search))
  4337.         _filedir
  4338.         return 0
  4339.         ;;
  4340.     -@(r|L|P|-@(remove|purge|listfiles)))
  4341.         COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) )
  4342.         return 0
  4343.         ;;
  4344.     *)
  4345.  
  4346.     COMPREPLY=( $( compgen -W '-i --install --unpack -A --record-avail \
  4347.             --configure -r --remove -P --purge --get-selections \
  4348.             --set-selections --update-avail --merge-avail \
  4349.             --clear-avail  --command-fd --forget-old-unavail -s \
  4350.             --status -p --print-avail -L --listfiles -l --list \
  4351.             -S --search -C --audit --print-architecture \
  4352.             --print-gnu-build-architecture \
  4353.             --print-installation-architecture \
  4354.             --compare-versions --help --version --force-help \
  4355.             --force-all --force-auto-select --force-downgrade \
  4356.             --force-configure-any --force-hold --force-bad-path \
  4357.             --force-not-root --force-overwrite \
  4358.             --force-overwrite-diverted --force-bad-verify \
  4359.             --force-depends-version --force-depends \
  4360.             --force-confnew --force-confold --force-confdef \
  4361.             --force-confmiss --force-conflicts --force-architecture\
  4362.             --force-overwrite-dir --force-remove-reinstreq \
  4363.             --force-remove-essential -Dh \
  4364.             --debug=help --licence --admindir= --root= --instdir= \
  4365.             -O --selected-only -E --skip-same-version \
  4366.             -G --refuse-downgrade -B --auto-deconfigure \
  4367.             --no-debsig --no-act -D --debug= --status-fd \
  4368.             -b --build -I --info -f --field -c --contents \
  4369.             -x --extract -X --vextract --fsys-tarfile -e --control \
  4370.             --ignore-depends= --abort-after' -- $cur ) )
  4371.         ;;
  4372.     esac
  4373.  
  4374.  
  4375. }
  4376. complete -F _dpkg $filenames dpkg dpkg-deb
  4377. }
  4378.  
  4379. # Debian GNU dpkg-reconfigure(8) completion
  4380. #
  4381. have dpkg-reconfigure &&
  4382. _dpkg_reconfigure()
  4383. {
  4384.     local cur prev opt
  4385.  
  4386.     COMPREPLY=()
  4387.     cur=`_get_cword`
  4388.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4389.  
  4390.  
  4391.     case "$prev" in
  4392.         -@(f|-frontend))
  4393.         opt=( $( echo /usr/share/perl5/Debconf/FrontEnd/* ) )
  4394.         opt=( ${opt[@]##*/} )
  4395.         opt=( ${opt[@]%.pm} )
  4396.         COMPREPLY=( $( compgen -W '${opt[@]}' -- $cur ) )
  4397.         return 0
  4398.         ;;
  4399.         -@(p|-priority))
  4400.           COMPREPLY=( $( compgen -W 'low medium high critical' -- $cur ) )
  4401.         return 0
  4402.         ;;
  4403.     esac
  4404.  
  4405.     if [[ "$cur" == -* ]]; then
  4406.         COMPREPLY=( $( compgen -W '-f --frontend -p --priority -a --all \
  4407.                        -u --unseen-only -h --help -s --showold \
  4408.                        --force --terse' -- $cur ) )
  4409.     else
  4410.         COMPREPLY=( $( _comp_dpkg_installed_packages $cur ) )
  4411.     fi
  4412. } &&
  4413. complete -F _dpkg_reconfigure $default dpkg-reconfigure
  4414.  
  4415. # Debian dpkg-source completion
  4416. #
  4417. have dpkg-source &&
  4418. _dpkg_source()
  4419. {
  4420.     local cur prev options work i action packopts unpackopts
  4421.  
  4422.     packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sp -su -sr -ss -sn -sA -sK -sP -sU -sR"
  4423.     unpackopts="-sp -sn -su"
  4424.     options=`echo "-x -b $packopts $unpackopts" | xargs echo | sort -u | xargs echo`
  4425.  
  4426.     COMPREPLY=()
  4427.     if [ "$1" != "dpkg-source" ]; then
  4428.         exit 1
  4429.     fi
  4430.     cur=`_get_cword`
  4431.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4432.     action="options"
  4433.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  4434.         if [[ ${COMP_WORDS[$i]} == "-x" ]]; then
  4435.             action=unpack
  4436.         elif [[ ${COMP_WORDS[$i]} == "-b" ]]; then
  4437.             action=pack
  4438.         elif [[ ${COMP_WORDS[$i]} == "-h" ]]; then
  4439.             action=help
  4440.         fi
  4441.     done
  4442.     # if currently seeing a complete option, return just itself.
  4443.     for i in $options; do
  4444.         if [ "$cur" = "$i" ]; then
  4445.             COMPREPLY=( "$cur" )
  4446.             return 0
  4447.         fi
  4448.     done
  4449.     case "$action" in
  4450.         "unpack")
  4451.             if [ "$cur" = "-" -o "$cur" = "-s" ]; then
  4452.                 COMPREPLY=( $unpackots )
  4453.                 return 0
  4454.             fi
  4455.             case "$prev" in
  4456.                 "-x")
  4457.                     COMPREPLY=( $( compgen -d -- "$cur" ) \
  4458.                             $( compgen -f -X '!*.dsc' -- "$cur" ) )
  4459.                     return 0
  4460.                     ;;
  4461.                 *)
  4462.                     COMPREPLY=( $unpackopts $(compgen -d -f -- "$cur" ) )
  4463.                     return 0
  4464.                     ;;
  4465.             esac
  4466.             return 0
  4467.             ;;
  4468.         "pack")
  4469.             if [ "$cur" = "-" ]; then
  4470.                 COMPREPLY=( $packopts )
  4471.                 return 0
  4472.             fi
  4473.             if [ "$cur" = "-s" ]; then
  4474.                 COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \
  4475.                         "-sA" "-sK" "-sP" "-sU" "-sR" )
  4476.                 return 0
  4477.             fi
  4478.             case "$prev" in
  4479.                 "-b")
  4480.                     COMPREPLY=( $( compgen -d -- "$cur" ) )
  4481.                     return 0
  4482.                     ;;
  4483.                 "-c"|"-l"|"-T"|"-i"|"-I")
  4484.                     # -c: get controlfile
  4485.                     # -l: get per-version info from this file
  4486.                     # -T: read variables here, not debian/substvars
  4487.                     # -i: <regexp> filter out files to ignore diffs of.
  4488.                     # -I: filter out files when building tarballs.
  4489.                     # return directory names and file names
  4490.                     COMPREPLY=( $( compgen -d -f ) )
  4491.                     return 0
  4492.                     ;;
  4493.                 "-F")
  4494.                     # -F: force change log format
  4495.                     COMPREPLY=( $( ( cd /usr/lib/dpkg/parsechangelog; compgen -f "$cur" ) ) )
  4496.                     return 0
  4497.                     ;;
  4498.                 "-V"|"-D")
  4499.                     # -V: set a substitution variable
  4500.                     # we don't know anything about possible variables or values
  4501.                     # so we don't try to suggest any completion.
  4502.                     COMPREPLY=()
  4503.                     return 0
  4504.                     ;;
  4505.                 "-D")
  4506.                     # -D: override or add a .dsc field and value
  4507.                     # if $cur doesn't contain a = yet, suggest variable names
  4508.                     if echo -- "$cur" | grep -q "="; then
  4509.                         # $cur contains a "="
  4510.                         COMPREPLY=()
  4511.                         return 0
  4512.                     else
  4513.                         COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files )
  4514.                         return 0
  4515.                     fi
  4516.                     ;;
  4517.                 "-U")
  4518.                     # -U: remove a field
  4519.                     # Suggest possible fieldnames
  4520.                     COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files )
  4521.                     return 0
  4522.                     ;;
  4523.                 *)
  4524.                     COMPREPLY=( $packopts )
  4525.                     return 0
  4526.                     ;;
  4527.             esac
  4528.             return 0
  4529.             ;;
  4530.         *)
  4531.             # if seeing a partial option, return possible completions.
  4532.             if [ "$cur" = "-s" ]; then
  4533.                 COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \
  4534.                         "-sA" "-sK" "-sP" "-sU" "-sR" )
  4535.                 return 0
  4536.             fi
  4537.             # else return all possible options.
  4538.             COMPREPLY=( $options )
  4539.             return 0
  4540.             ;;
  4541.     esac
  4542. } &&
  4543. complete -F _dpkg_source dpkg-source
  4544.  
  4545. # Debian Linux dselect(8) completion.
  4546. #
  4547. have dselect &&
  4548. _dselect()
  4549. {
  4550.     local cur prev
  4551.  
  4552.     COMPREPLY=()
  4553.     cur=`_get_cword`
  4554.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4555.  
  4556.     case "$prev" in
  4557.          --admindir)
  4558.           _filedir -d
  4559.           return 0
  4560.           ;;
  4561.  
  4562.          -@(D|debug))
  4563.           _filedir
  4564.           return 0
  4565.           ;;
  4566.     esac
  4567.  
  4568.     if [[ "$cur" == -* ]]; then
  4569.         COMPREPLY=( $( compgen -W '--admindir --help --version --licence \
  4570.                   --license --expert --debug' -- $cur ) )
  4571.     else
  4572.         COMPREPLY=( $( compgen -W 'access update select install config \
  4573.                   remove quit' -- $cur ) )
  4574.     fi
  4575.  
  4576.  
  4577.     return 0
  4578. } &&
  4579. complete -F _dselect $filenames dselect
  4580.  
  4581. # Java completion
  4582. #
  4583.  
  4584. # available path elements completion
  4585. have java && {
  4586. _java_path()
  4587. {
  4588.     cur=${cur##*:}
  4589.     _filedir '@(jar|zip)'
  4590. }
  4591.  
  4592. # exact classpath determination
  4593. _java_find_classpath()
  4594. {
  4595.     local i
  4596.  
  4597.     # search first in current options
  4598.     for (( i=1; i < COMP_CWORD; i++ )); do
  4599.         if [[ "${COMP_WORDS[i]}" == -@(cp|classpath) ]]; then
  4600.             classpath=${COMP_WORDS[i+1]}
  4601.             break
  4602.         fi
  4603.     done
  4604.  
  4605.     # default to environment
  4606.     [ -z "$classpath" ] && classpath=$CLASSPATH
  4607.  
  4608.     # default to current directory
  4609.     [ -z "$classpath" ] && classpath=.
  4610. }
  4611.  
  4612. # exact sourcepath determination
  4613. _java_find_sourcepath()
  4614. {
  4615.     local i
  4616.  
  4617.     # search first in current options
  4618.     for (( i=1; i < COMP_CWORD; i++ )); do
  4619.         if [[ "${COMP_WORDS[i]}" == -sourcepath ]]; then
  4620.             sourcepath=${COMP_WORDS[i+1]}
  4621.             break
  4622.         fi
  4623.     done
  4624.  
  4625.     # default to classpath
  4626.     [ -z "$sourcepath" ] && _java_find_classpath
  4627.     sourcepath=$classpath
  4628. }
  4629.  
  4630. # available classes completion
  4631. _java_classes()
  4632. {
  4633.     local classpath i
  4634.  
  4635.     # find which classpath to use
  4636.     _java_find_classpath
  4637.  
  4638.     # convert package syntax to path syntax
  4639.     cur=${cur//.//}
  4640.     # parse each classpath element for classes
  4641.     for i in ${classpath//:/ }; do
  4642.         if [ -r $i ] && [[ "$i" == *.@(jar|zip) ]]; then
  4643.             if type zipinfo &> /dev/null; then
  4644.                 COMPREPLY=( "${COMPREPLY[@]}" $( zipinfo -1 \
  4645.                 "$i" | grep "^$cur" | grep '\.class$' | \
  4646.                 grep -v "\\$" ) )
  4647.             else
  4648.                 COMPREPLY=( "${COMPREPLY[@]}" $( jar tf "$i" \
  4649.                 "$cur" | grep "\.class$" | grep -v "\\$" ) )
  4650.             fi
  4651.  
  4652.         elif [ -d $i ]; then
  4653.             i=${i%/}
  4654.             COMPREPLY=( "${COMPREPLY[@]}" $( find "$i" -type f \
  4655.             -path "$i/$cur*.class" 2>/dev/null | \
  4656.             grep -v "\\$" | sed -e "s|^$i/||" ) )
  4657.         fi
  4658.     done
  4659.  
  4660.     # remove class extension
  4661.     COMPREPLY=( ${COMPREPLY[@]%.class} )
  4662.     # convert path syntax to package syntax
  4663.     COMPREPLY=( ${COMPREPLY[@]//\//.} )
  4664. }
  4665.  
  4666. # available packages completion
  4667. _java_packages()
  4668. {
  4669.     local sourcepath i
  4670.  
  4671.     # find wich sourcepath to use
  4672.     _java_find_sourcepath
  4673.  
  4674.     # convert package syntax to path syntax
  4675.     cur=${cur//.//}
  4676.     # parse each sourcepath element for packages
  4677.     for i in ${sourcepath//:/ }; do
  4678.         if [ -d $i ]; then
  4679.             COMPREPLY=( "${COMPREPLY[@]}" $( command ls -F -d \
  4680.                 $i/$cur* 2>/dev/null | sed -e 's|^'$i'/||' ) )
  4681.         fi
  4682.     done
  4683.     # keep only packages
  4684.     COMPREPLY=( $( echo "${COMPREPLY[@]}" | tr " " "\n" | grep "/$" ) )
  4685.     # remove packages extension
  4686.     COMPREPLY=( ${COMPREPLY[@]%/} )
  4687.     # convert path syntax to package syntax
  4688.     cur=${COMPREPLY[@]//\//.}
  4689. }
  4690.  
  4691. # java completion
  4692. #
  4693. _java()
  4694. {
  4695.     local cur prev i
  4696.  
  4697.     COMPREPLY=()
  4698.     cur=`_get_cword`
  4699.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4700.  
  4701.     for ((i=1; i < $COMP_CWORD; i++)); do
  4702.         case ${COMP_WORDS[$i]} in
  4703.             -cp|-classpath)
  4704.             ((i++))    # skip the classpath string.
  4705.             ;;
  4706.             -*)
  4707.             # this is an option, not a class/jarfile name.
  4708.             ;;
  4709.             *)
  4710.             # once we've seen a class, just do filename completion
  4711.             _filedir
  4712.             return 0
  4713.             ;;
  4714.         esac
  4715.     done
  4716.  
  4717.     case $prev in
  4718.         -@(cp|classpath))
  4719.             _java_path
  4720.             return 0
  4721.             ;;
  4722.     esac
  4723.  
  4724.     if [[ "$cur" == -* ]]; then
  4725.         # relevant options completion
  4726.         COMPREPLY=( $( compgen -W '-client -hotspot -server -classic \
  4727.                 -cp -classpath -D -verbose -verbose:class \
  4728.                 -verbose:gc -version:jni -version \
  4729.                 -showversion -? -help -X -jar \
  4730.                 -ea -enableassertions -da -disableassertions \
  4731.                 -esa -enablesystemassertions \
  4732.                 -dsa -disablesystemassertions ' -- $cur ) )
  4733.     else
  4734.         if [[ "$prev" == -jar ]]; then
  4735.             # jar file completion
  4736.             _filedir jar
  4737.         else
  4738.             # classes completion
  4739.             _java_classes
  4740.         fi
  4741.     fi
  4742. }
  4743. complete -F _java $filenames java
  4744. }
  4745.  
  4746. # javadoc completion
  4747. #
  4748. have javadoc &&
  4749. _javadoc()
  4750. {
  4751.     COMPREPLY=()
  4752.     local cur prev
  4753.  
  4754.     cur=`_get_cword`
  4755.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4756.  
  4757.     case $prev in
  4758.         -@(overview|helpfile|stylesheetfile))
  4759.             _filedir
  4760.             return 0
  4761.             ;;
  4762.         -d)
  4763.             _filedir -d
  4764.             return 0
  4765.             ;;
  4766.         -@(classpath|bootclasspath|docletpath|sourcepath|extdirs))
  4767.             _java_path
  4768.             return 0
  4769.             ;;
  4770.     esac
  4771.  
  4772.     if [[ "$cur" == -* ]]; then
  4773.         # relevant options completion
  4774.         COMPREPLY=( $( compgen -W '-overview -public -protected \
  4775.                 -package -private -help -doclet -docletpath \
  4776.                 -sourcepath -classpath -exclude -subpackages \
  4777.                 -breakiterator -bootclasspath -source -extdirs \
  4778.                 -verbose -locale -encoding -J -d -use -version \
  4779.                 -author -docfilessubdirs -splitindex \
  4780.                 -windowtitle -doctitle -header -footer -bottom \
  4781.                 -link -linkoffline -excludedocfilessubdir \
  4782.                 -group -nocomment -nodeprecated -noqualifier \
  4783.                 -nosince -nodeprecatedlist -notree -noindex \
  4784.                 -nohelp -nonavbar -quiet -serialwarn -tag \
  4785.                 -taglet -tagletpath -charset -helpfile \
  4786.                 -linksource -stylesheetfile -docencoding' -- \
  4787.                 $cur ) )
  4788.     else
  4789.         # source files completion
  4790.         _filedir java
  4791.         # packages completion
  4792.         _java_packages
  4793.     fi
  4794. } &&
  4795. complete -F _javadoc $filenames javadoc
  4796.  
  4797. # javac completion
  4798. #
  4799. have javac &&
  4800. _javac()
  4801. {
  4802.     COMPREPLY=()
  4803.     local cur prev
  4804.  
  4805.     cur=`_get_cword`
  4806.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4807.  
  4808.     case $prev in
  4809.         -d)
  4810.             _filedir -d
  4811.             return 0
  4812.             ;;
  4813.         -@(classpath|bootclasspath|sourcepath|extdirs))
  4814.             _java_path
  4815.             return 0
  4816.             ;;
  4817.     esac
  4818.  
  4819.     if [[ "$cur" == -* ]]; then
  4820.         # relevant options completion
  4821.         COMPREPLY=( $( compgen -W '-g -g:none -g:lines -g:vars\
  4822.         -g:source -O -nowarn -verbose -deprecation -classpath\
  4823.         -sourcepath -bootclasspath -extdirs -d -encoding -source\
  4824.         -target -help' -- $cur ) )
  4825.     else
  4826.         # source files completion
  4827.         _filedir java
  4828.     fi
  4829. } &&
  4830. complete -F _javac $filenames javac
  4831.  
  4832. # PINE address-book completion
  4833. #
  4834. have pine &&
  4835. _pineaddr()
  4836. {
  4837.     local cur
  4838.  
  4839.     COMPREPLY=()
  4840.     cur=`_get_cword`
  4841.  
  4842.     COMPREPLY=( $( compgen -W '$( awk "{print \$1}" ~/.addressbook 2>/dev/null)' \
  4843.             -- $cur ) )
  4844. } &&
  4845. complete -F _pineaddr $default pine
  4846.  
  4847. # mutt completion
  4848. #
  4849. # Mutt doesn't have an "addressbook" like Pine, but it has aliases and
  4850. # a "query" function to retrieve addresses, so that's what we use here.
  4851. have mutt || have muttng && {
  4852. _muttaddr()
  4853. {
  4854.     _muttaliases
  4855.     _muttquery
  4856.     return 0
  4857. }
  4858.  
  4859. _muttconffiles()
  4860. {
  4861.     local file sofar
  4862.     local -a newconffiles
  4863.  
  4864.     sofar=" $1 "
  4865.     shift
  4866.     while [[ "$1" ]]; do
  4867.         newconffiles=( $(sed -rn 's|^source[[:space:]]+([^[:space:]]+).*$|\1|p' $(eval echo $1) ) )
  4868.         for file in "${newconffiles[@]}"; do
  4869.         [[ ! "$file" ]] || [[ "${sofar/ ${file} / }" != "$sofar" ]] &&
  4870.             continue
  4871.         sofar="$sofar $file"
  4872.         sofar=" $(eval _muttconffiles \"$sofar\" $file) "
  4873.         done
  4874.         shift
  4875.     done
  4876.     echo $sofar
  4877. }
  4878.  
  4879. _muttaliases()
  4880. {
  4881.     local cur muttrc
  4882.     local -a conffiles aliases
  4883.     cur=`_get_cword`
  4884.  
  4885.     [ -f ~/.${muttcmd}/${muttcmd}rc ] && muttrc="~/.${muttcmd}/${muttcmd}rc"
  4886.     [ -f ~/.${muttcmd}rc ] && muttrc="~/.${muttcmd}rc"
  4887.     [ -z "$muttrc" ] && return 0
  4888.  
  4889.     conffiles=( $(eval _muttconffiles $muttrc $muttrc) )
  4890.     aliases=( $( sed -rn 's|^alias[[:space:]]+([^[:space:]]+).*$|\1|p' \
  4891.             $(eval echo "${conffiles[@]}") ) )
  4892.     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${aliases[*]}" -- $cur ) )
  4893.  
  4894.     return 0
  4895. }
  4896.  
  4897. _muttquery()
  4898. {
  4899.     local cur querycmd
  4900.     local -a queryresults
  4901.     cur=`_get_cword`
  4902.  
  4903.     querycmd="$( $muttcmd -Q query_command  | sed -r 's|^query_command=\"(.*)\"$|\1|; s|%s|'$cur'|' )"
  4904.     if [ -z "$cur" -o -z "$querycmd" ]; then
  4905.         queryresults=()
  4906.     else 
  4907.         queryresults=( $( $querycmd | \
  4908.           sed -nr '2,$s|^([^[:space:]]+).*|\1|p' ) )
  4909.     fi
  4910.  
  4911.     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${queryresults[*]}" \
  4912.             -- $cur ) )
  4913.  
  4914.     return 0
  4915. }
  4916.  
  4917. _muttfiledir()
  4918. {
  4919.     local cur folder spoolfile
  4920.     cur=`_get_cword`
  4921.  
  4922.     # This is currently not working so well. Perhaps this function should
  4923.     # just call _filedir() for the moment.
  4924.     if [[ $cur == [=+]* ]]; then
  4925.         folder="$( $muttcmd -Q folder | sed -r 's|^folder=\"(.*)\"$|\1|' )"
  4926.         : folder:=~/Mail
  4927.  
  4928.         # Match any file in $folder beginning with $cur
  4929.         # (minus the leading '=' sign).
  4930.         COMPREPLY=( $( compgen -f -- "$folder/${cur:1}" ) )
  4931.         COMPREPLY=( ${COMPREPLY[@]#$folder/} )
  4932.         return 0
  4933.     elif [ "$cur" == !* ]; then
  4934.         spoolfile="$( $muttcmd -Q spoolfile | sed -r 's|^spoolfile=\"(.*)\"$|\1|' )"
  4935.         [ ! -z "$spoolfile" ] && eval cur="${cur/^!/$spoolfile}";
  4936.     fi
  4937.     _filedir
  4938.  
  4939.     return 0
  4940. }
  4941.  
  4942. _mutt()
  4943. {
  4944.     local cur prev
  4945.     cur=`_get_cword`
  4946.     prev=${COMP_WORDS[COMP_CWORD-1]}
  4947.  
  4948.     COMPREPLY=()
  4949.     
  4950.     [ ${COMP_WORDS[0]} == muttng ] && muttcmd="muttng" || muttcmd="mutt"
  4951.  
  4952.     case "$cur" in
  4953.     -*)
  4954.         COMPREPLY=( $( compgen -W '-A -a -b -c -e -f -F -H -i -m -n \
  4955.                         -p -Q -R -s -v -x -y -z -Z -h' \
  4956.                         -- $cur ) )
  4957.         return 0
  4958.         ;;
  4959.     *)
  4960.         case "$prev" in
  4961.         -@(a|f|F|H|i))
  4962.             _muttfiledir
  4963.             return 0
  4964.             ;;
  4965.         -A)
  4966.             _muttaliases
  4967.             return 0
  4968.             ;;
  4969.         -@(e|m|Q|s|h|p|R|v|y|z|Z))
  4970.             return 0
  4971.             ;;
  4972.         *)
  4973.             _muttaddr
  4974.             return 0
  4975.             ;;
  4976.         esac
  4977.         ;;
  4978.     esac
  4979.     
  4980. }
  4981. complete -F _mutt $default $filenames mutt muttng
  4982. }
  4983.  
  4984. _configure_func()
  4985. {
  4986.     local cur
  4987.  
  4988.     COMPREPLY=()
  4989.     cur=`_get_cword`
  4990.  
  4991.     # if $COMP_CONFIGURE_HINTS is not null, then completions of the form
  4992.     # --option=SETTING will include 'SETTING' as a contextual hint
  4993.     [[ "$cur" != -* ]] && return 0
  4994.  
  4995.     if [ -n "$COMP_CONFIGURE_HINTS" ]; then
  4996.         COMPREPLY=( $( $1 --help | awk '/^  --[A-Za-z]/ { print $1; if ($2 ~ /--[A-Za-z]/) print $2 }' | sed -e 's/[[,].*//g' | grep ^$cur ) )
  4997.  
  4998.     else
  4999.         COMPREPLY=( $( $1 --help | awk '/^  --[A-Za-z]/ { print $1; if ($2 ~ /--[A-Za-z]/) print $2 }' | sed -e 's/[[,=].*//g' | grep ^$cur ) )
  5000.     fi
  5001. }
  5002. complete -F _configure_func $default configure
  5003.  
  5004. # Debian reportbug(1) completion
  5005. #
  5006. have reportbug &&
  5007. _reportbug()
  5008. {
  5009.     local cur prev
  5010.  
  5011.     COMPREPLY=()
  5012.     cur=`_get_cword`
  5013.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5014.  
  5015.     case "$prev" in
  5016.         -f|--filename|-i|--include|--mta|-o|--output)
  5017.         _filedir
  5018.         return 0
  5019.         ;;
  5020.         -B|--bts)
  5021.         COMPREPLY=( $( compgen -W "debian guug kde mandrake help" -- \
  5022.                    $cur ))
  5023.         return 0
  5024.         ;;
  5025.         -e|--editor|--mua)
  5026.         COMP_WORDS=(COMP_WORDS[0] $cur)
  5027.         COMP_CWORD=1
  5028.         _command
  5029.         return 0
  5030.         ;;
  5031.         --mode)
  5032.         COMPREPLY=( $( compgen -W "novice standard expert" -- $cur ) )
  5033.         return 0
  5034.         ;;
  5035.         -S|--severity)
  5036.         COMPREPLY=( $( compgen -W "grave serious important normal \
  5037.                        minor wishlist" -- $cur ) )
  5038.         return 0
  5039.         ;;
  5040.         -u|--ui|--interface)
  5041.         COMPREPLY=( $( compgen -W "newt text gnome" -- $cur ) )
  5042.         return 0
  5043.         ;;
  5044.         -t|--type)
  5045.         COMPREPLY=( $( compgen -W "gnats debbugs" -- $cur ) )
  5046.         return 0
  5047.         ;;
  5048.         -T|--tags)
  5049.         COMPREPLY=( $( compgen -W "none patch security upstream sid \
  5050.                        woody potato sarge fixed" -- $cur ))
  5051.         return 0
  5052.         ;;
  5053.         *)
  5054.         ;;
  5055.     esac
  5056.     
  5057.     COMPREPLY=($( compgen -W '-h --help -v --version -a --af -b \
  5058.             --no-query-bts --query-bts -B --bts -c --configure \
  5059.             --no-config-files --check-available -d --debug \
  5060.             --no-check-available -e --editor --email -f \
  5061.             --filename -g --gnupg -H --header -i --include -j \
  5062.             --justification -l --ldap --no-ldap -L --list-cc -m \
  5063.             --maintonly --mode --mua --mta --mutt -n --mh --nmh \
  5064.             -o --output -p --print -P --pgp --proxy --http_proxy\
  5065.             -q --quiet -Q --query-only --realname --report-quiet \
  5066.             --reply-to --replyto -s --subject -S --severity \
  5067.             --smtphost -t --type -T --tags --template -V -x \
  5068.             --no-cc --package-version -z --no-compress \
  5069.             --ui --interface -u \
  5070.             wnpp boot-floppies kernel-image' -- $cur ) \
  5071.                 $( apt-cache pkgnames -- $cur 2> /dev/null ) )
  5072.     _filedir
  5073.     return 0
  5074. } &&
  5075. complete -F _reportbug $filenames reportbug
  5076.  
  5077. # Debian querybts(1) completion
  5078. #
  5079. have querybts &&
  5080. _querybts()
  5081. {
  5082.     local cur prev
  5083.  
  5084.     COMPREPLY=()
  5085.     cur=`_get_cword`
  5086.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5087.  
  5088.     case "$prev" in
  5089.         -B|--bts)
  5090.         COMPREPLY=( $( compgen -W "debian guug kde mandrake help" -- \
  5091.                    $cur ))
  5092.         return 0
  5093.         ;;
  5094.         -u|--ui|--interface)
  5095.         COMPREPLY=($( compgen -W "newt text gnome" -- $cur ))
  5096.         return 0
  5097.         ;;
  5098.         *)
  5099.         ;;
  5100.     esac
  5101.  
  5102.     COMPREPLY=($( compgen -W '-h --help -v --version -A --archive \
  5103.             -B --bts -l --ldap --no-ldap --proxy= --http_proxy= \
  5104.             -s --source -w --web -u --ui --interface \
  5105.             wnpp boot-floppies' -- $cur ) \
  5106.                 $( apt-cache pkgnames -- $cur 2> /dev/null ) )
  5107. } &&
  5108. complete -F _querybts $filenames querybts
  5109.  
  5110. # update-alternatives completion
  5111. #
  5112. have update-alternatives && {
  5113. installed_alternatives()
  5114. {
  5115.     local admindir
  5116.     # find the admin dir
  5117.     for i in alternatives dpkg/alternatives rpm/alternatives; do
  5118.         [ -d /var/lib/$i ] && admindir=/var/lib/$i && break
  5119.     done
  5120.     for (( i=1; i < COMP_CWORD; i++ )); do
  5121.         if [[ "${COMP_WORDS[i]}" == --admindir ]]; then
  5122.             admindir=${COMP_WORDS[i+1]}
  5123.             break
  5124.         fi
  5125.     done
  5126.     COMPREPLY=( $( command ls $admindir | grep "^$cur" ) )
  5127. }
  5128.  
  5129. _update_alternatives()
  5130. {
  5131.     local cur prev mode args i
  5132.  
  5133.     COMPREPLY=()
  5134.     cur=`_get_cword`
  5135.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5136.  
  5137.     case "$prev" in
  5138.     --@(altdir|admindir))
  5139.         _filedir -d
  5140.         return 0
  5141.         ;;
  5142.     --@(help|version))
  5143.         return 0
  5144.         ;;
  5145.     esac
  5146.  
  5147.     # find wich mode to use and how many real args used so far
  5148.     for (( i=1; i < COMP_CWORD; i++ )); do
  5149.         if [[ "${COMP_WORDS[i]}" == --@(install|remove|auto|display|config|remove-all) ]]; then
  5150.             mode=${COMP_WORDS[i]}
  5151.             args=$(($COMP_CWORD - i))
  5152.             break
  5153.         fi
  5154.     done
  5155.  
  5156.     case $mode in
  5157.     --install)
  5158.         case $args in
  5159.         1)
  5160.             _filedir
  5161.             ;;
  5162.         2)
  5163.             installed_alternatives
  5164.             ;;
  5165.         3)
  5166.             _filedir
  5167.             ;;
  5168.         esac
  5169.         ;;
  5170.     --remove)
  5171.         case $args in
  5172.         1)
  5173.             installed_alternatives
  5174.             ;;
  5175.         2)
  5176.             _filedir
  5177.             ;;
  5178.         esac
  5179.         ;;
  5180.     --auto)
  5181.         installed_alternatives
  5182.         ;;
  5183.     --remove-all)
  5184.         installed_alternatives
  5185.         ;;
  5186.     --display)
  5187.         installed_alternatives
  5188.         ;;
  5189.     --config)
  5190.         installed_alternatives
  5191.         ;;
  5192.     *)
  5193.         COMPREPLY=( $( compgen -W '--verbose --quiet --help --version \
  5194.                    --altdir --admindir' -- $cur ) \
  5195.                 $( compgen -W '--install --remove --auto --display \
  5196.                    --config' -- $cur ) )
  5197.     esac
  5198. }
  5199. complete -F _update_alternatives update-alternatives
  5200. }
  5201.  
  5202. # Python completion
  5203. #
  5204. have python &&
  5205. _python()
  5206. {
  5207.     local prev cur
  5208.  
  5209.     COMPREPLY=()
  5210.     cur=`_get_cword`
  5211.     prev=${COMP_WORDS[COMP_CWORD-1]##*/}
  5212.  
  5213.     case "$prev" in
  5214.     -Q)
  5215.         COMPREPLY=( $( compgen -W "old new warn warnall" -- $cur ) )
  5216.         return 0
  5217.         ;;
  5218.     -W)
  5219.         COMPREPLY=( $( compgen -W "ignore default all module once error" -- $cur ) )
  5220.         return 0
  5221.         ;;
  5222.     -c)
  5223.         _filedir '@(py|pyc|pyo)'
  5224.         return 0
  5225.         ;;
  5226.     !(python|-?))
  5227.         [[ ${COMP_WORDS[COMP_CWORD-2]} != -@(Q|W) ]] && _filedir
  5228.         ;;
  5229.     esac
  5230.  
  5231.  
  5232.     # if '-c' is already given, complete all kind of files.
  5233.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  5234.         if [[ ${COMP_WORDS[i]} == -c ]]; then
  5235.             _filedir
  5236.         fi
  5237.     done
  5238.  
  5239.  
  5240.     if [[ "$cur" != -* ]]; then
  5241.         _filedir '@(py|pyc|pyo)'
  5242.     else
  5243.         COMPREPLY=( $( compgen -W "- -d -E -h -i -O -Q -S -t -u \
  5244.                        -U -v -V -W -x -c" -- $cur ) )
  5245.     fi
  5246.  
  5247.  
  5248.  
  5249.     return 0
  5250. } &&
  5251. complete -F _python $filenames python
  5252.  
  5253. # Perl completion
  5254. #
  5255. have perl &&
  5256. {
  5257. _perlmodules()
  5258. {
  5259.     COMPREPLY=( $( compgen -P "$prefix" -W "$( perl -e 'sub mods { my ($base,$dir)=@_; return if  $base !~ /^\Q$ENV{cur}/; chdir($dir) or return; for (glob(q[*.pm])) {s/\.pm$//; print qq[$base$_\n]}; mods(/^(?:[.\d]+|$Config{archname}-$Config{osname}|auto)$/ ? undef : qq[${base}${_}\\\\:\\\\:],qq[$dir/$_]) for grep {-d} glob(q[*]); } mods(undef,$_) for @INC;' )" -- $cur ) )
  5260. }
  5261.  
  5262. _perl()
  5263. {
  5264.     local cur prev prefix temp
  5265.  
  5266.     COMPREPLY=()
  5267.     cur=`_get_cword`
  5268.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5269.     prefix=""
  5270.  
  5271.     # completing an option (may or may not be separated by a space)
  5272.     if [[ "$cur" == -?* ]]; then
  5273.     temp=$cur
  5274.     prev=${temp:0:2}
  5275.     cur=${temp:2}
  5276.     prefix=$prev
  5277.     fi
  5278.  
  5279.     # only handle module completion for now
  5280.     case "$prev" in
  5281.         -I|-x)
  5282.         COMPREPLY=( $( compgen -d -P "$prev" -- "$cur" ) )
  5283.         return 0
  5284.         ;;
  5285.     -m|-M)
  5286.         _perlmodules
  5287.         return 0
  5288.         ;;
  5289.     esac
  5290.  
  5291.     # handle case where first parameter is not a dash option
  5292.     if [[ "${COMP_WORDS[COMP_CWORD]}" != -* ]]; then
  5293.     _filedir
  5294.     return 0
  5295.     fi
  5296.  
  5297.     # complete using basic options
  5298.     COMPREPLY=( $( compgen -W '-C -s -T -u -U -W -X -h -v -V -c -w -d -D -p \
  5299.             -n -a -F -l -0 -I -m -M -P -S -x -i -e ' -- $cur ) )
  5300.     return 0
  5301. }
  5302. complete -F _perl $filenames perl
  5303.  
  5304. _perldoc()
  5305. {
  5306.     local cur prev prefix temp
  5307.  
  5308.     COMPREPLY=()
  5309.     cur=`_get_cword`
  5310.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5311.     prefix=""
  5312.  
  5313.     # completing an option (may or may not be separated by a space)
  5314.     if [[ "$cur" == -?* ]]; then
  5315.     temp=$cur
  5316.     prev=${temp:0:2}
  5317.     cur=${temp:2}
  5318.     prefix=$prev
  5319.     fi
  5320.  
  5321.     # complete builtin perl functions
  5322.     case $prev in
  5323.     -f)
  5324.         COMPREPLY=( $( compgen -W 'chomp chop chr crypt hex index lc \
  5325.         lcfirst length oct ord pack q qq reverse rindex sprintf \
  5326.         substr tr uc ucfirst y m pos quotemeta s split study qr abs \
  5327.         atan2 cos exp hex int log oct rand sin sqrt srand pop push \
  5328.         shift splice unshift grep join map qw reverse sort unpack \
  5329.         delete each exists keys values binmode close closedir \
  5330.         dbmclose dbmopen die eof fileno flock format getc print \
  5331.         printf read readdir rewinddir seek seekdir select syscall \
  5332.         sysread sysseek syswrite tell telldir truncate warn write \
  5333.         pack read syscall sysread syswrite unpack vec -X chdir chmod \
  5334.         chown chroot fcntl glob ioctl link lstat mkdir open opendir \
  5335.         readlink rename rmdir stat symlink umask unlink utime caller \
  5336.         continue do dump eval exit goto last next redo return \
  5337.         sub wantarray caller import local my our package use defined \
  5338.         formline reset scalar undef \
  5339.         alarm exec fork getpgrp getppid getpriority kill pipe qx \
  5340.         setpgrp setpriority sleep system times wait waitpid \
  5341.         import no package require use bless dbmclose dbmopen package \
  5342.         ref tie tied untie use accept bind connect getpeername \
  5343.         getsockname getsockopt listen recv send setsockopt shutdown \
  5344.         socket socketpair msgctl msgget msgrcv msgsnd semctl semget \
  5345.         semop shmctl shmget shmread shmwrite endgrent endhostent \
  5346.         endnetent endpwent getgrent getgrgid getgrnam getlogin \
  5347.         getpwent getpwnam getpwuid setgrent setpwent endprotoent \
  5348.         endservent gethostbyaddr gethostbyname gethostent \
  5349.         getnetbyaddr getnetbyname getnetent getprotobyname \
  5350.         getprotobynumber getprotoent getservbyname getservbyport \
  5351.         getservent sethostent setnetent setprotoent setservent \
  5352.         gmtime localtime time times' -- $cur ) )
  5353.         return 0
  5354.         ;;
  5355.     esac
  5356.  
  5357.     case $cur in
  5358.     -*)
  5359.         COMPREPLY=( $( compgen -W '-h -v -t -u -m -l -F -X -f -q' -- $cur ))
  5360.         return 0
  5361.         ;;
  5362.     */*)
  5363.         return 0
  5364.         ;;
  5365.     *)
  5366.         _perlmodules
  5367.         COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W '$( PAGER=cat man perl 2>/dev/null | sed -ne "/perl.*Perl overview/,/perlwin32/s/^[^a-z0-9]*\([a-z0-9]*\).*$/\1/p")' -- $cur ) )
  5368.  
  5369.         return 0
  5370.         ;;
  5371.     esac
  5372. }
  5373. complete -F _perldoc $default perldoc
  5374. }
  5375.  
  5376. # rcs(1) completion
  5377. #
  5378. have rcs &&
  5379. _rcs()
  5380. {
  5381.     local cur prev file dir i
  5382.  
  5383.     COMPREPLY=()
  5384.     cur=`_get_cword`
  5385.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5386.  
  5387.     file=${cur##*/}
  5388.     dir=${cur%/*}
  5389.  
  5390.     # deal with relative directory
  5391.     [ "$file" = "$dir" ] && dir=.
  5392.  
  5393.     COMPREPLY=( $( compgen -f "$dir/RCS/$file" ) )
  5394.  
  5395.     for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do
  5396.         file=${COMPREPLY[$i]##*/}
  5397.         dir=${COMPREPLY[$i]%RCS/*}
  5398.         COMPREPLY[$i]=$dir$file
  5399.     done
  5400.     
  5401.     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -G "$dir/$file*,v" ) )
  5402.  
  5403.     for (( i=0; i < ${#COMPREPLY[@]}; i++ )); do
  5404.         COMPREPLY[$i]=${COMPREPLY[$i]%,v}
  5405.     done
  5406.  
  5407.     # default to files if nothing returned and we're checking in.
  5408.     # otherwise, default to directories
  5409.     [ ${#COMPREPLY[@]} -eq 0 -a $1 = ci ] && _filedir || _filedir -d
  5410. } &&
  5411. complete -F _rcs $filenames ci co rlog rcs rcsdiff
  5412.  
  5413. # lilo(8) completion
  5414. #
  5415. have lilo && {
  5416. _lilo_labels()
  5417. {
  5418.     COMPREPLY=( $( awk -F'=' '/label/ {print $2}' \
  5419.         /etc/lilo.conf | sed -e 's/"//g' | grep "^$cur" ) )
  5420. }
  5421.  
  5422. _lilo()
  5423. {
  5424.     local cur prev
  5425.  
  5426.     COMPREPLY=()
  5427.     cur=`_get_cword`
  5428.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5429.  
  5430.     case $prev in
  5431.         -@(C|i|m|s|S))
  5432.             _filedir
  5433.             return 0
  5434.             ;;
  5435.         -r)
  5436.             _filedir -d
  5437.             return 0
  5438.             ;;
  5439.         -@(I|D|R))
  5440.             # label completion
  5441.             _lilo_labels
  5442.             return 0
  5443.             ;;
  5444.         -@(A|b|M|u|U))
  5445.             # device completion
  5446.             cur=${cur:=/dev/}
  5447.             _filedir
  5448.             return 0
  5449.             ;;
  5450.         -T)
  5451.             # topic completion
  5452.             COMPREPLY=( $( compgen -W 'help ChRul EBDA geom geom= \
  5453.                     table= video' -- $cur ) )
  5454.             return 0
  5455.             ;;
  5456.     esac
  5457.  
  5458.     if [[ "$cur" == -* ]]; then
  5459.         # relevant options completion
  5460.         COMPREPLY=( $( compgen -W '-A -b -c -C -d -f -g -i -I -l -L -m \
  5461.             -M -p -P -q -r -R -s -S -t -T -u -U -v -V -w -x -z' -- \
  5462.             $cur ) )
  5463.     fi
  5464. }
  5465. complete -F _lilo lilo
  5466. }
  5467.  
  5468. # links completion
  5469. #
  5470. have links &&
  5471. _links()
  5472. {
  5473.     local cur
  5474.   
  5475.     COMPREPLY=()
  5476.     cur=`_get_cword`
  5477.   
  5478.     case "$cur" in
  5479.         --*)
  5480.         COMPREPLY=( $( compgen -W '--help' -- $cur ) )
  5481.         ;;
  5482.         -*)
  5483.         COMPREPLY=( $( compgen -W '-async-dns -max-connections \
  5484.                 -max-connections-to-host -retries \
  5485.                 -receive-timeout -unrestartable-receive-timeout\
  5486.                 -format-cache-size -memory-cache-size \
  5487.                 -http-proxy -ftp-proxy -download-dir \
  5488.                 -assume-codepage -anonymous -dump -no-connect \
  5489.                 -source -version -help' -- $cur ) )
  5490.         ;;
  5491.         *)
  5492.         if [ -r ~/.links/links.his ]; then
  5493.             COMPREPLY=( $( compgen -W '$( < ~/.links/links.his )' \
  5494.                    -- $cur ) )
  5495.         fi
  5496.                 _filedir '@(htm|html)'
  5497.                 return 0
  5498.         ;;
  5499.     esac
  5500.   
  5501.     return 0
  5502. } &&
  5503. complete -F _links $filenames links
  5504.  
  5505. [ $UNAME = FreeBSD ] && {
  5506. # FreeBSD package management tool completion
  5507. #
  5508. _pkg_delete()
  5509. {
  5510.     local cur pkgdir prev
  5511.  
  5512.     pkgdir=${PKG_DBDIR:-/var/db/pkg}/
  5513.     cur=`_get_cword`
  5514.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5515.  
  5516.     [ "$prev" = "-o" -o "$prev" = "-p" -o "$prev" = "-W" ] && return 0
  5517.  
  5518.     COMPREPLY=( $( compgen -d $pkgdir$cur ) )
  5519.     COMPREPLY=( ${COMPREPLY[@]#$pkgdir} )
  5520.  
  5521.     return 0
  5522. }
  5523. complete -F _pkg_delete $dirnames pkg_delete pkg_info
  5524. have pkg_deinstall && complete -F _pkg_delete $dirnames pkg_deinstall
  5525.  
  5526. # FreeBSD kernel module commands
  5527. #
  5528. _kldload()
  5529. {
  5530.     local cur moddir
  5531.  
  5532.     moddir=/modules/
  5533.     [ -d $moddir ] || moddir=/boot/kernel/
  5534.     cur=`_get_cword`
  5535.  
  5536.     COMPREPLY=( $( compgen -f $moddir$cur ) )
  5537.     COMPREPLY=( ${COMPREPLY[@]#$moddir} )
  5538.     COMPREPLY=( ${COMPREPLY[@]%.ko} )
  5539.  
  5540.     return 0
  5541. }
  5542. complete -F _kldload $filenames kldload
  5543.  
  5544. _kldunload()
  5545. {
  5546.     local cur
  5547.     cur=`_get_cword`
  5548.     COMPREPLY=( $(kldstat | sed -ne "s/^.*[ \t]\+\($cur[a-z_]\+\).ko$/\1/p") )
  5549. }
  5550. complete -F _kldunload $filenames kldunload
  5551. }
  5552.  
  5553. # FreeBSD portupgrade completion
  5554. #
  5555. have portupgrade &&
  5556. _portupgrade()
  5557. {
  5558.     local cur pkgdir prev
  5559.  
  5560.     pkgdir=${PKG_DBDIR:-/var/db/pkg}/
  5561.     cur=`_get_cword`
  5562.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5563.  
  5564.     [ "$prev" = "-l" -o "$prev" = "-L" -o "$prev" = "-o" ] && return 0
  5565.  
  5566.     COMPREPLY=( $( compgen -d $pkgdir$cur ) )
  5567.     COMPREPLY=( ${COMPREPLY[@]#$pkgdir} )
  5568.     COMPREPLY=( ${COMPREPLY[@]%-*} )
  5569.  
  5570.     return 0
  5571. } &&
  5572. complete -F _portupgrade $dirnames portupgrade
  5573.  
  5574. # FreeBSD portinstall completion
  5575. #
  5576. have portinstall &&
  5577. _portinstall()
  5578. {
  5579.     local cur portsdir prev indexfile
  5580.     local -a COMPREPLY2
  5581.  
  5582.     portsdir=${PORTSDIR:-/usr/ports}/
  5583.     cur=`_get_cword`
  5584.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5585.     # First try INDEX-5
  5586.     indexfile=$portsdir/INDEX-5
  5587.     # Then INDEX if INDEX-5 does not exist or system is not FreeBSD 5.x
  5588.     [ "${OSTYPE%.*}" = "freebsd5" -a -f $indexfile ] ||
  5589.       indexfile=$portsdir/INDEX
  5590.  
  5591.     [ "$prev" = "-l" -o "$prev" = "-L" -o "$prev" = "-o" ] && return 0
  5592.  
  5593.     COMPREPLY=( $( egrep "^$cur" < $indexfile | cut -d'|' -f1 ) )
  5594.     COMPREPLY2=( $( egrep "^[^\|]+\|$portsdir$cur" < $indexfile | \
  5595.             cut -d'|' -f2 ) )
  5596.     COMPREPLY2=( ${COMPREPLY2[@]#$portsdir} )
  5597.     COMPREPLY=( "${COMPREPLY[@]}" "${COMPREPLY2[@]}" )
  5598.  
  5599.     return 0
  5600. } &&
  5601. complete -F _portinstall $dirnames portinstall
  5602.  
  5603. # Slackware Linux removepkg completion
  5604. #
  5605. have removepkg && [ -f /etc/slackware-version ] &&
  5606. _removepkg()
  5607. {
  5608.     local packages cur
  5609.  
  5610.     COMPREPLY=()
  5611.     cur=`_get_cword`
  5612.  
  5613.     COMPREPLY=( $( (cd /var/log/packages; compgen -f -- "$cur") ) )
  5614. } &&
  5615. complete -F _removepkg $filenames removepkg &&
  5616.     complete $dirnames -f -X '!*.tgz' installpkg upgradepkg explodepkg
  5617.  
  5618. # look(1) completion
  5619. #
  5620. have look && 
  5621. _look()
  5622. {
  5623.     local cur
  5624.   
  5625.     COMPREPLY=()
  5626.     cur=`_get_cword`
  5627.  
  5628.     if [ $COMP_CWORD = 1 ]; then
  5629.         COMPREPLY=( $( compgen -W '$(look $cur)' ) )
  5630.     fi
  5631. } &&
  5632. complete -F _look $default look
  5633.  
  5634. # ypcat(1) and ypmatch(1) completion
  5635. #
  5636. have ypmatch &&
  5637. _ypmatch()
  5638. {
  5639.     local cur map
  5640.  
  5641.     COMPREPLY=()
  5642.     cur=`_get_cword`
  5643.  
  5644.     [ $1 = ypcat ] && [ $COMP_CWORD -gt 1 ] && return 0
  5645.     [ $1 = ypmatch ] && [ $COMP_CWORD -gt 2 ] && return 0
  5646.  
  5647.     if [ $1 = ypmatch ] && [ $COMP_CWORD -eq 1 ] && \
  5648.        [ ${#COMP_WORDS[@]} -eq 3 ]; then
  5649.         map=${COMP_WORDS[2]}
  5650.         COMPREPLY=( $( compgen -W '$( ypcat $map | \
  5651.                         cut -d':' -f 1 )' -- $cur) )
  5652.     else
  5653.         [ $1 = ypmatch ] && [ $COMP_CWORD -ne 2 ] && return 0
  5654.         COMPREPLY=( $( compgen -W \
  5655.                   '$( echo $(ypcat -x | cut -d"\"" -f 2))' -- $cur))
  5656.     fi
  5657.  
  5658.     return 0
  5659. } &&
  5660. complete -F _ypmatch ypmatch ypcat
  5661.  
  5662. # mplayer(1) completion
  5663. #
  5664. have mplayer && {
  5665. _mplayer_options_list()
  5666. {
  5667.     cur=${cur%\\}
  5668.     COMPREPLY=( $( $1 $2 help 2> /dev/null | \
  5669.         sed -e '1,/^Available/d' | awk '{print $1}' | \
  5670.         sed -e 's/:$//' -e 's/^'${2#-}'$//' -e 's/<.*//' | \
  5671.         grep "^$cur" ) )
  5672. }
  5673.  
  5674. _mplayer()
  5675. {
  5676.     local cmd cur prev skinsdir IFS=$' \t\n' i j k=0
  5677.  
  5678.     COMPREPLY=()
  5679.     cmd=${COMP_WORDS[0]}
  5680.     cur=`_get_cword`
  5681.     prev=${COMP_WORDS[COMP_CWORD-1]}
  5682.  
  5683.     case "$prev" in
  5684.         -@(ac|afm|vc|vfm|ao|vo|vop|fstype))
  5685.             _mplayer_options_list mplayer $prev
  5686.             return 0
  5687.             ;;
  5688.         -@(oac|ovc|of))
  5689.             _mplayer_options_list mencoder $prev
  5690.             return 0
  5691.             ;;
  5692.         -audiofile)
  5693.             _filedir '@(mp3|MP3|mpg|MPG|ogg|OGG|wav|WAV|mid|MID|flac|FLAC|mka|MKA)'
  5694.             return 0
  5695.             ;;
  5696.         -font)
  5697.             _filedir '@(desc|ttf)'
  5698.             return 0
  5699.             ;;
  5700.         -sub)
  5701.             _filedir '@(srt|SRT|sub|SUB|txt|TXT|utf|UTF|rar|RAR|mpsub|smi|js|ssa|SSA|aas|AAS)'
  5702.             return 0
  5703.             ;;
  5704.         -vobsub)
  5705.             _filedir '@(idx|IDX|ifo|IFO|sub|SUB)'
  5706.             IFS=$'\t\n' 
  5707.             COMPREPLY=( $( for i in "${COMPREPLY[@]}"; do
  5708.                         if [ -f $i -a -r $i ]; then
  5709.                             echo ${i%.*}
  5710.                         else
  5711.                             echo $i
  5712.                         fi
  5713.                        done ) )
  5714.             IFS=$' \t\n' 
  5715.             return 0
  5716.             ;;
  5717.         -ifo)
  5718.             _filedir '@(ifo|IFO)'
  5719.             return 0
  5720.             ;;
  5721.         -cuefile)
  5722.             _filedir '@(bin|BIN|cue|CUE)'
  5723.             return 0
  5724.             ;;
  5725.         -skin)
  5726.             # if you don't have installed mplayer in /usr/local you
  5727.             # may want to set the MPLAYER_SKINS_DIR global variable
  5728.             if [ -n "$MPLAYER_SKINS_DIR" ]; then
  5729.                 skinsdir=$MPLAYER_SKINS_DIR
  5730.             else
  5731.                 skinsdir=/usr/local/share/mplayer/Skin
  5732.             fi
  5733.  
  5734.             IFS=$'\t\n' 
  5735.             for i in ~/.mplayer/Skin $skinsdir; do
  5736.                 if [ -d $i -a -r $i ]; then
  5737.                     for j in $( compgen -d $i/$cur ); do
  5738.                         COMPREPLY[$k]=${j#$i/}
  5739.                         k=$((++k))
  5740.                     done
  5741.                 fi
  5742.             done
  5743.             IFS=$' \t\n' 
  5744.             return 0
  5745.             ;;
  5746.         -@(mixer|@(cdrom|dvd)-device|dvdauth|fb|zrdev))
  5747.             cur=${cur:=/dev/}
  5748.             _filedir
  5749.             return 0
  5750.             ;;
  5751.         -@(edl?(out)|lircconf|menu-cfg|playlist|csslib|dumpfile)| \
  5752.         -@(subfile|vobsub|aofile|fbmodeconfig|include|o|dvdkey)| \
  5753.         -passlogfile)
  5754.             _filedir
  5755.             return 0
  5756.             ;;
  5757.         -@(auto@(q|sync)|loop|menu-root|speed|sstep|aid|alang)| \
  5758.         -@(?(@(audio|sub)-)demuxer|bandwidth|cache|chapter)| \
  5759.         -@(dvd?(angle)|fps|frames|mc|passwd|user|sb|srate|ss|vcd)| \
  5760.         -@(vi?(d|vo)|ffactor|sid|slang|spu@(align|aa|gauss))| \
  5761.         -@(vobsubid|delay|bpp|brightness|contrast|dfbopts|display)| \
  5762.         -@(fbmode|geometry|guiwid|hue|icelayer|screen[wh]|wid)| \
  5763.         -@(monitor@(aspect|-@(dotclock|[hv]freq))|panscan|saturation)| \
  5764.         -@(xineramascreen|zr@(crop|norm|quality|[xy]doff|[vh]dec))| \
  5765.         -@(aspect|pp|x|y|xy|z|stereo|audio-@(density|delay|preload))| \
  5766.         -@(endpos|osdlevel|ffourcc|sws|channels|skiplimit|format)| \
  5767.         -@(ofps|aa@(driver|@(osd|sub)color)|vobsubout?(i@(ndex|d)))| \
  5768.         -sub@(-bg-@(alpha|color)|cp|delay|fps|pos|align|width)| \
  5769.         -sub@(font-@(blur|outline|autoscale|encoding|@(osd|text)-scale)))
  5770.             return 0
  5771.             ;;
  5772.         -lavdopts)
  5773.             COMPREPLY=( $( compgen -W 'ec er= bug= idct= gray' \
  5774.                     -- $cur ) )
  5775.             return 0
  5776.             ;;
  5777.         -lavcopts)
  5778.             COMPREPLY=( $( compgen -W 'vcodec= vqmin= vqscale= \
  5779.                     vqmax= mbqmin= mbqmax= vqdiff= \
  5780.                     vmax_b_frames= vme= vhq v4mv \
  5781.                     keyint= vb_strategy= vpass= \
  5782.                     aspect= vbitrate= vratetol= \
  5783.                     vrc_maxrate= vrc_minrate= \
  5784.                     vrc_buf_size= vb_qfactor= vi_qfactor= \
  5785.                     vb_qoffset= vi_qoffset= vqblur= \
  5786.                     vqcomp= vrc_eq= vrc_override= \
  5787.                     vrc_init_cplx= vqsquish= vlelim= \
  5788.                     vcelim= vstrict= vdpart vpsize= gray \
  5789.                     vfdct= idct= lumi_mask= dark_mask= \
  5790.                     tcplx_mask= scplx_mask= naq ildct \
  5791.                     format= pred qpel precmp= cmp= \
  5792.                     subcmp= predia= dia= trell last_pred= \
  5793.                     preme= subq= psnr mpeg_quant aic umv' \
  5794.                     -- $cur ) )
  5795.             return 0
  5796.             ;;
  5797.         -ssf)
  5798.             COMPREPLY=( $( compgen -W 'lgb= cgb= ls= cs= chs= \
  5799.                     cvs=' -- $cur ) )
  5800.             return 0
  5801.             ;;
  5802.         -jpeg)
  5803.             COMPREPLY=( $( compgen -W 'noprogressive progressive \
  5804.                     nobaseline baseline optimize= \
  5805.                     smooth= quality= outdir=' -- $cur ) )
  5806.             return 0
  5807.             ;;
  5808.         -xvidopts)
  5809.             COMPREPLY=( $( compgen -W 'dr2 nodr2' -- $cur ) )
  5810.             return 0
  5811.             ;;
  5812.         -xvidencopts)
  5813.             COMPREPLY=( $( compgen -W 'pass= bitrate= \
  5814.                     fixed_quant= me_quality= 4mv \
  5815.                     rc_reaction_delay_factor= \
  5816.                     rc_averaging_period= rc_buffer= \
  5817.                     quant_range= min_key_interval= \
  5818.                     max_key_interval= mpeg_quant \
  5819.                     mod_quant lumi_mask hintedme \
  5820.                     hintfile debug keyframe_boost= \
  5821.                     kfthreshold= kfreduction=' -- $cur ) )
  5822.             return 0
  5823.             ;;
  5824.         -divx4opts)
  5825.             COMPREPLY=( $( compgen -W 'br= key= deinterlace q= \
  5826.                     min_quant= max_quant= rc_period= \
  5827.                     rc_reaction_period= crispness= \
  5828.                     rc_reaction_ratio= pass= vbrpass= \
  5829.                     help' -- $cur ) )
  5830.             return 0
  5831.             ;;
  5832.         -info)
  5833.             COMPREPLY=( $( compgen -W 'name= artist= genre= \
  5834.                     subject= copyright= srcform= \
  5835.                     comment= help' -- $cur ) )
  5836.             return 0
  5837.             ;;
  5838.         -lameopts)
  5839.             COMPREPLY=( $( compgen -W 'vbr= abr cbr br= q= aq= \
  5840.                     ratio= vol= mode= padding= fast \
  5841.                     preset= help' -- $cur ) )
  5842.             return 0
  5843.             ;;
  5844.         -rawaudio)
  5845.             COMPREPLY=( $( compgen -W 'on channels= rate= \
  5846.                     samplesize= format=' -- $cur ) )
  5847.             return 0
  5848.             ;;
  5849.         -rawvideo)
  5850.             COMPREPLY=( $( compgen -W 'on fps= sqcif qcif cif \
  5851.                     4cif pal ntsc w= h= y420 yv12 yuy2 \
  5852.                     y8 format= size=' -- $cur ) )
  5853.             return 0
  5854.             ;;
  5855.         -aop)
  5856.             COMPREPLY=( $( compgen -W 'list= delay= format= fout= \
  5857.                     volume= mul= softclip' -- $cur ) )
  5858.             return 0
  5859.             ;;
  5860.         -dxr2)
  5861.             COMPREPLY=( $( compgen -W 'ar-mode= iec958-encoded \
  5862.                     iec958-decoded mute ucode= 75ire bw \
  5863.                     color interlaced macrovision= norm= \
  5864.                     square-pixel ccir601-pixel cr-left= \
  5865.                     cr-right= cr-top= cr-bot= ck-rmin= \
  5866.                     ck-gmin= ck-bmin= ck-rmax= ck-gmax= \
  5867.                     ck-bmax= ck-r= ck-g= ck-b= \
  5868.                     ignore-cache= ol-osd= olh-cor= \
  5869.                     olw-cor= olx-cor= oly-cor= overlay \
  5870.                     overlay-ratio= update-cache' -- $cur ))
  5871.             return 0
  5872.             ;;
  5873.         -tv)
  5874.             COMPREPLY=( $( compgen -W 'on noaudio driver= device= \
  5875.                     input= freq= outfmt= width= height= \
  5876.                     buffersize= norm= channel= chanlist= \
  5877.                     audiorate= forceaudio alsa amode= \
  5878.                     forcechan= adevice= audioid= volume= \
  5879.                     bass= treble= balance= fps= \
  5880.                     channels= immediatemode=' -- $cur ) )
  5881.             return 0
  5882.             ;;
  5883.         -mf)
  5884.             COMPREPLY=( $( compgen -W 'on w= h= fps= type=' \
  5885.                     -- $cur ) )
  5886.             return 0
  5887.             ;;
  5888.         -cdda)
  5889.             COMPREPLY=( $( compgen -W 'speed= paranoia= \
  5890.                     generic-dev= sector-size= overlap= \
  5891.                     toc-bias toc-offset= skip noskip' \
  5892.                     -- $cur ) )
  5893.             return 0
  5894.             ;;
  5895.         -input)
  5896.             COMPREPLY=( $( compgen -W 'conf= ar-delay ar-rate \
  5897.                     keylist cmdlist js-dev file' -- $cur ) )
  5898.             return 0
  5899.             ;;
  5900.         -af)
  5901.             COMPREPLY=( $( compgen -W 'resample resample= \
  5902.                     channels channels= format format= \
  5903.                     volume volume= delay delay= pan \
  5904.                     pan= sub sub= surround surround=' \
  5905.                     -- $cur ) )
  5906.             return 0
  5907.             ;;
  5908.         -af-adv)
  5909.             COMPREPLY=( $( compgen -W 'force= list=' -- $cur ) )
  5910.             return 0
  5911.             ;;
  5912.     esac
  5913.  
  5914.     case "$cur" in
  5915.         -*)
  5916.             COMPREPLY=( $( compgen -W '-aid -alang -audio-demuxer \
  5917.                     -audiofile -cdrom-device -cache -cdda \
  5918.                     -channels -chapter -csslib -demuxer \
  5919.                     -dvd -dvd-device -dvdangle -dvdauth \
  5920.                     -dvdkey -dvdnav -forceidx -fps -frames \
  5921.                     -hr-mp3-seek -idx -mc -mf -ni -nobps \
  5922.                     -passwd -rawaudio -rtsp-stream-over-tcp\
  5923.                     -skipopening -sb -srate -ss -tv -user \
  5924.                     -vcd -vid -vivo -ifo -ffactor -font \
  5925.                     -noautosub -nooverlapsub -sid -slang \
  5926.                     -sub -subcc -subcp -sub-demuxer \
  5927.                     -subdelay -subfont-autoscale \
  5928.                     -subfont-blur -subfont-encoding \
  5929.                     -subfont-osd-scale -subfont-outline \
  5930.                     -subfont-text-scale -subfps -subfile \
  5931.                     -subpos -unicode -utf8 -vobsub \
  5932.                     -vobsubid -ac -afm -aspect -flip \
  5933.                     -lavdopts -noaspect -nosound -pp -ssf \
  5934.                     -stereo -sws -vc -vfm -vop -xvidopts\
  5935.                     -xy -zoom -bandwidth -cuefile \
  5936.                     -noextbased -rawvideo -overlapsub \
  5937.                     -sub-bg-alpha -sub-bg-color -subalign \
  5938.                     -subwidth -sub-no-text-pp -spualign \
  5939.                     -spuaa -spugauss -pphelp -verbose -v \
  5940.                     -noni -noidx -nohr-mp3-seek -extbased \
  5941.                     -bps -oldpp -nozoom -noflip -nounicode \
  5942.                     -noutf8' -- $cur ) )
  5943.             # add mplayer specific options
  5944.             [[ "$cmd" == @(?(g)mplayer) ]] && COMPREPLY=( "${COMPREPLY[@]}" \
  5945.                 $(compgen -W '-autoq -autosync -benchmark \
  5946.                     -framedrop -h -help -hardframedrop \
  5947.                     -identify -input -lircconf -loop \
  5948.                     -nojoystick -nolirc -nortc -playlist \
  5949.                     -quiet -really-quiet -rnd -sdp -skin \
  5950.                     -slave -softsleep -speed -sstep \
  5951.                     -use-stdin -dumpaudio -dumpfile \
  5952.                     -dumpstream -dumpvideo -dumpmicrodvdsub\
  5953.                     -dumpmpsub -dumpsrtsub -dumpjacosub \
  5954.                     -dumpsami -dumpsub -osdlevel -af \
  5955.                     -af-adv -ao -aofile -aop -delay -mixer \
  5956.                     -nowaveheader -bpp -brightness \
  5957.                     -contrast -display -double -dr -dxr2 \
  5958.                     -fb -fbmode -fbmodeconfig -forcexv -fs \
  5959.                     -geometry -hue -icelayer -jpeg \
  5960.                     -monitor-dotclock -monitor-hfreq \
  5961.                     -monitor-vfreq -monitoraspect \
  5962.                     -nograbpointer -noslices -panscan \
  5963.                     -rootwin -saturation -screenw -screenh \
  5964.                     -stop-xscreensaver -vm -vo -vsync -wid \
  5965.                     -xineramascreen -z -zrbw -zrcrop \
  5966.                     -zrdev -zrfd -zrhelp -zrnorm -zrquality \
  5967.                     -zrvdec -zrhdec -zrxdoff -zrydoff -y \
  5968.                     -edl -edlout -enqueue -fixed-vo \
  5969.                     -menu -menu-root -menu-cfg -shuffle \
  5970.                     -format -aahelp -dfbopts -fstype \
  5971.                     -guiwid -nokeepaspect -x --help \
  5972.                     -aaosdcolor -aasubcolor -aadriver \
  5973.                     -aaextended -aaeight' -- $cur) )
  5974.             # add mencoder specific options
  5975.             [[ "$cmd" = mencoder ]] && COMPREPLY=( "${COMPREPLY[@]}" \
  5976.                 $(compgen -W '-audio-density -audio-delay \
  5977.                     -audio-preload -divx4opts -endpos \
  5978.                     -ffourcc -include -info -lameopts \
  5979.                     -lavcopts -noskip -o -oac -ofps -ovc \
  5980.                     -passlogfile -skiplimit -vobsubout \
  5981.                     -vobsuboutindex -vobsuboutid \
  5982.                     -xvidencopts -of --verbose' -- $cur) )
  5983.             ;;
  5984.         *)
  5985.             _filedir '@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|ASF|vob|VOB|bin|BIN|dat|DAT|vcd|VCD|ps|PS|pes|PES|fli|FLI|flv|FLV|viv|VIV|rm?(j)|RM?(J)|ra?(m)|RA?(M)|yuv|YUV|mov|MOV|qt|QT|mp[34]|MP[34]|m4v|M4V|og[gm]|OG[GM]|wav|WAV|dump|DUMP|mk[av]|MK[AV]|m4a|M4A|aac|AAC|m2v|M2V|dv|DV|rmvb|RMVB|mid|MID|ts|TS|3gp|mpc|MPC|flac|FLAC|flv|FLV|divx|DIVX)'
  5986.             ;;
  5987.     esac
  5988.  
  5989.     return 0
  5990. }
  5991. complete $filenames -F _mplayer mplayer mencoder gmplayer kplayer
  5992. }
  5993.  
  5994. # KDE dcop completion
  5995. #
  5996. have dcop &&
  5997. _dcop()
  5998. {
  5999.     local cur compstr
  6000.  
  6001.     COMPREPLY=()
  6002.     cur=`_get_cword`
  6003.     if [ -z $cur ]; then
  6004.         compstr=${COMP_WORDS[*]}
  6005.     else
  6006.         compstr=$( command echo ${COMP_WORDS[*]} | sed "s/ $cur$//" )
  6007.     fi
  6008.     COMPREPLY=( $( compgen -W '$( command $compstr | sed s/\(.*\)// )'  -- $cur ) )
  6009. } &&
  6010. complete -F _dcop dcop
  6011.  
  6012. # wvdial(1) completion
  6013. #
  6014. have wvdial &&
  6015. _wvdial()
  6016. {
  6017.     local cur prev config i IFS=$'\t\n'
  6018.  
  6019.     COMPREPLY=()
  6020.     cur=`_get_cword`
  6021.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6022.  
  6023.     case $prev in
  6024.         --config)
  6025.             _filedir
  6026.             return 0
  6027.             ;;
  6028.     esac
  6029.  
  6030.     case $cur in
  6031.         -*)
  6032.             COMPREPLY=( $( compgen -W '--config --chat \
  6033.                 --remotename --help --version --no-syslog' \
  6034.                 -- $cur ) )
  6035.             ;;
  6036.         *)
  6037.             # start with global and personal config files
  6038.                    config="/etc/wvdial.conf"$'\t'"$HOME/.wvdialrc"
  6039.             # replace with command line config file if present
  6040.             for (( i=1; i < COMP_CWORD; i++ )); do
  6041.                 if [[ "${COMP_WORDS[i]}" == "--config" ]]; then
  6042.                     config=${COMP_WORDS[i+1]}
  6043.                     break
  6044.                 fi
  6045.             done
  6046.             # parse config files for sections and
  6047.             # remove default section
  6048.             COMPREPLY=( $( sed -ne \
  6049.                     "s|^\[Dialer \($cur.*\)\]$|\1|p" \
  6050.                     $config 2>/dev/null |grep -v '^Defaults$'))
  6051.             # escape spaces
  6052.             COMPREPLY=${COMPREPLY// /\\ }
  6053.             ;;
  6054.     esac
  6055.  
  6056. } &&
  6057. complete -F _wvdial wvdial
  6058.  
  6059. # gpg(1) completion
  6060. #
  6061. have gpg &&
  6062. _gpg() 
  6063. {
  6064.     local cur prev
  6065.  
  6066.     COMPREPLY=()
  6067.     cur=`_get_cword`
  6068.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6069.  
  6070.     case "$prev" in
  6071.     -@(s|-sign|-clearsign|-decrypt-files|-load-extension)) 
  6072.         _filedir
  6073.         return 0
  6074.         ;;
  6075.     --@(export|@(?(l|nr|nrl)sign|edit)-key)) 
  6076.         # return list of public keys
  6077.         COMPREPLY=( $( compgen -W "$( gpg --list-keys 2>/dev/null | sed -ne 's@^pub.*/\([^ ]*\).*\(<\([^>]*\)>\).*$@\1 \3@p')" -- "$cur" ))
  6078.         return 0
  6079.         ;;
  6080.     -@(r|-recipient))
  6081.         COMPREPLY=( $( compgen -W "$( gpg --list-keys 2>/dev/null | sed -ne 's@^pub.*<\([^>]*\)>.*$@\1@p')" -- "$cur" ))
  6082.         if [ -e ~/.gnupg/gpg.conf ]; then
  6083.             COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$( sed -ne 's@^[ \t]*group[ \t][ \t]*\([^=]*\).*$@\1@p' ~/.gnupg/gpg.conf  )" -- "$cur") )
  6084.         fi
  6085.         return 0
  6086.         ;;
  6087.     esac
  6088.  
  6089.     if [[ "$cur" == -* ]]; then
  6090.         COMPREPLY=( $( compgen -W '-s -b -e -f -c -d -a -r -u -Z -o -v\
  6091.                 -q -n -N $(gpg --dump-options)' -- $cur ) )
  6092.      fi
  6093.  
  6094. } &&
  6095. complete -F _gpg $default gpg
  6096.  
  6097. # iconv(1) completion
  6098. #
  6099. have iconv &&
  6100. _iconv()
  6101. {
  6102.     local cur prev
  6103.  
  6104.     COMPREPLY=()
  6105.     cur=`_get_cword`
  6106.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6107.  
  6108.     case "$prev" in
  6109.         -@(f|t|-@(from|to)-code))
  6110.             COMPREPLY=( $( compgen -W \
  6111.                 '$( iconv --list | sed -e "s@//@@;" )' -- "$cur" ) )
  6112.             return 0
  6113.             ;;
  6114.     esac
  6115.  
  6116.  
  6117.     if [[ "$cur" = -* ]]; then
  6118.         COMPREPLY=( $( compgen -W '--from-code -f --to-code -t --list
  6119.         --output -o --verbose' -- "$cur" ) )
  6120.         return 0
  6121.     fi
  6122. } &&
  6123. complete -F _iconv $default iconv
  6124.  
  6125. # dict(1) completion
  6126. #
  6127. { have dict || have rdict; } && {
  6128. _dictdata()
  6129. {
  6130.     dict $host $port $1 2>/dev/null | sed -ne \
  6131.         's/^['$'\t '']['$'\t '']*\([^'$'\t '']*\).*$/\1/p'
  6132. }
  6133.  
  6134. _dict()
  6135. {
  6136.     local cur prev host port db dictfile
  6137.  
  6138.     COMPREPLY=()
  6139.     cur=`_get_cword`
  6140.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6141.     dictfile=/usr/share/dict/words
  6142.  
  6143.     for (( i=1; i < COMP_CWORD; i++ )); do
  6144.         case "${COMP_WORDS[i]}" in
  6145.         -@(h|--host))
  6146.             host=${COMP_WORDS[i+1]}
  6147.             [ -n "$host" ] && host="-h $host"
  6148.             i=$((++i))
  6149.             ;;
  6150.         -@(p|-port))
  6151.             port=${COMP_WORDS[i+1]}
  6152.             [ -n "$port" ] && port="-p $port"
  6153.             i=$((++i))
  6154.             ;;
  6155.         -@(d|-database))
  6156.             db=${COMP_WORDS[i+1]}
  6157.             [ -n "$db" ] && host="-d $db"
  6158.             i=$((++i))
  6159.             ;;
  6160.         *)
  6161.             ;;
  6162.         esac
  6163.     done
  6164.  
  6165.     if [[ "$cur" = -* ]]; then
  6166.         COMPREPLY=( $( compgen -W '-h --host -p --port -d --database \
  6167.                    -m --match -s --strategy -c --config -C \
  6168.                    --nocorrect -D --dbs -S --strats -H \
  6169.                    --serverhelp -i --info -I --serverinfo \
  6170.                    -a --noauth -u --user -k --key -V --version \
  6171.                    -L --license --help -v --verbose -r --raw \
  6172.                    -P --pager --debug --html --pipesize --client' \
  6173.                    -- "$cur" ) )
  6174.         return 0
  6175.     fi
  6176.  
  6177.     case "$prev" in
  6178.     -@(d|-database|i|info))
  6179.         COMPREPLY=( $( compgen -W '$( _dictdata -D )' -- "$cur" ) )
  6180.         return 0
  6181.         ;;
  6182.     -@(s|-strategy))
  6183.         COMPREPLY=( $( compgen -W '$( _dictdata -S )' -- "$cur" ) )
  6184.         return 0
  6185.         ;;
  6186.     *)
  6187.         ;;
  6188.     esac
  6189.  
  6190.     [ -r $dictfile ] && \
  6191.         COMPREPLY=( $( compgen -W '$( cat $dictfile )' -- "$cur" ) )
  6192. }
  6193. complete -F _dict $default dict rdict
  6194. }
  6195.  
  6196. # cdrecord(1) completion
  6197. #
  6198. have cdrecord &&
  6199. _cdrecord()
  6200. {
  6201.     local cur prev i generic_options track_options track_mode
  6202.  
  6203.     COMPREPLY=()
  6204.     cur=`_get_cword`
  6205.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6206.  
  6207.     # foo=bar style option
  6208.     if [[ "$cur" == *=* ]]; then
  6209.         prev=${cur/=*/}
  6210.         cur=${cur/*=/}
  6211.         case "$prev" in
  6212.             @(text|cue)file)
  6213.                 _filedir
  6214.                 return 0
  6215.                 ;;
  6216.             blank)
  6217.                 COMPREPLY=( $( compgen -W 'help all fast \
  6218.                 track unreserve trtail unclose session' \
  6219.                 -- $cur ) )
  6220.                 return 0
  6221.                 ;;
  6222.             driveropts)
  6223.                 COMPREPLY=( $( compgen -W 'burnfree noburnfree\
  6224.                   varirec= audiomaster forcespeed noforcespeed\
  6225.                   speedread nospeedread singlesession \
  6226.                   nosinglesession hidecdr nohidecdr tattooinfo\
  6227.                   tattoofile=' -- $cur ) )
  6228.                 return 0
  6229.                 ;;
  6230.         esac
  6231.     fi
  6232.  
  6233.     generic_options=(-version -v -V -d -silent -s -force -immed -dummy \
  6234.              -dao -raw -raw96r -raw96p -raw16 -multi -msinfo -toc \
  6235.              -atip -fix -nofix -waiti -load -lock -eject -format \
  6236.              -setdropts -checkdrive -prcap -inq -scanbus -reset \
  6237.              -abort -overburn -ignsize -useinfo -packet -noclose \
  6238.              -text debug= kdebug= kd= minbuf= speed= blank= fs= \
  6239.              dev= gracetime= timeout= driver= driveropts= \
  6240.              defpregap= pktsize= mcn= textfile= cuefile=)
  6241.     track_options=(-audio -swab -data -mode2 -xa -xa1 -xa2 -xamix -cdi \
  6242.                -isosize -pad padsize= -nopad -shorttrack -noshorttrack\
  6243.                pregap= -preemp -nopreemp -copy -nocopy -scms tcsize= \
  6244.                isrc= index=)
  6245.     # look if previous was either a file or a track option
  6246.     track_mode=0
  6247.     if [ $COMP_CWORD -gt 1 ]; then
  6248.         if [ -f "$prev" ]; then
  6249.             track_mode=1
  6250.         else
  6251.             for (( i=0; i < ${#track_options[@]}; i++ )); do
  6252.                 if [[ "${track_options[i]}" == "$prev" ]]; then
  6253.                     track_mode=1
  6254.                     break
  6255.                 fi
  6256.             done
  6257.         fi
  6258.     fi
  6259.  
  6260.     # files are always eligible completion
  6261.     _filedir
  6262.     # track options are always available
  6263.     COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W '${track_options[@]}' -- $cur ) )
  6264.     # general options are no more available after file or track option
  6265.     if [ $track_mode -eq 0 ]; then
  6266.         COMPREPLY=( "${COMPREPLY[@]}" \
  6267.                 $( compgen -W '${generic_options[@]}' -- $cur ) )
  6268.     fi
  6269.  
  6270. } &&
  6271. complete -F _cdrecord $filenames cdrecord
  6272.  
  6273. # mkisofs(8) completion
  6274. #
  6275. have mkisofs &&
  6276. _mkisofs()
  6277. {
  6278.     local cur prev
  6279.  
  6280.     COMPREPLY=()
  6281.     cur=`_get_cword`
  6282.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6283.  
  6284.     case "$prev" in
  6285.         -@(o|abstract|biblio|check-session|copyright|log-file|root-info|prep-boot|*-list))
  6286.             _filedir
  6287.             return 0
  6288.             ;;
  6289.         -*-charset)
  6290.             COMPREPLY=( $( mkisofs -input-charset help 2>&1 | \
  6291.                     tail +3 | grep "^$cur") )
  6292.             return 0
  6293.             ;;
  6294.         -uid)
  6295.             _uids
  6296.             return 0
  6297.             ;;
  6298.         -gid)
  6299.             _gids
  6300.             return 0
  6301.             ;;
  6302.     esac
  6303.  
  6304.     if [[ "$cur" == -* ]]; then
  6305.         COMPREPLY=( $( compgen -W '-abstract -A -allow-lowercase \
  6306.                 -allow-multidot -biblio -cache-inodes \
  6307.                 -no-cache-inodes -b -eltorito-alt-boot -B -G \
  6308.                 -hard-disk-boot -no-emul-boot -no-boot \
  6309.                 -boot-load-seg -boot-load-size \
  6310.                 -boot-info-table -C -c -check-oldname \
  6311.                 -check-session -copyright -d -D -dir-mode \
  6312.                 -dvd-video -f -file-mode -gid -gui \
  6313.                 -graft-points -hide -hide-list -hidden \
  6314.                 -hidden-list -hide-joliet -hide-joliet-list \
  6315.                 -hide-joliet-trans-tbl -hide-rr-moved \
  6316.                 -input-charset -output-charset -iso-level -J \
  6317.                 -joliet-long -jcharset -l -L -log-file -m \
  6318.                 -exclude-list -max-iso9660-filenames -M -N \
  6319.                 -new-dir-mode -nobak -no-bak -force-rr -no-rr \
  6320.                 -no-split-symlink-components \
  6321.                 -no-split-symlink-fields -o -pad -no-pad \
  6322.                 -path-list -P -p -print-size -quiet -R -r \
  6323.                 -relaxed-filenames -sort -split-output \
  6324.                 -stream-media-size -stream-file-name -sysid -T\
  6325.                 -table-name -ucs-level -udf -uid \
  6326.                 -use-fileversion -U -no-iso-translate -V \
  6327.                 -volset -volset-size -volset-seqno -v -x -z \
  6328.                 -hfs -apple -map -magic -hfs-creator \
  6329.                 -hfs-type -probe -no-desktop -mac-name \
  6330.                 -boot-hfs-file -part -auto -cluster-size \
  6331.                 -hide-hfs -hide-hfs-list -hfs-volid \
  6332.                 -icon-position -root-info -prep-boot \
  6333.                 -input-hfs-charset -output-hfs-charset \
  6334.                 -hfs-unlock -hfs-bless -hfs-parms --cap \
  6335.                 --netatalk --double --ethershare --ushare \
  6336.                 --exchange --sgi --xinet --macbin --single \
  6337.                 --dave --sfm --osx-double --osx-hfs' -- $cur ))
  6338.     else
  6339.         _filedir
  6340.     fi
  6341.  
  6342. } &&
  6343. complete -F _mkisofs $filenames mkisofs
  6344.  
  6345. # mc(1) completion
  6346. #
  6347. have mc &&
  6348. _mc()
  6349. {
  6350.     local cur prev
  6351.  
  6352.     COMPREPLY=()
  6353.     cur=`_get_cword`
  6354.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6355.  
  6356.     # -name value style option
  6357.     case "$prev" in
  6358.         -@(e|v|l|P))
  6359.             _filedir
  6360.             return 0
  6361.             ;;
  6362.     esac
  6363.  
  6364.     # --name=value style option
  6365.     if [[ "$cur" == *=* ]]; then
  6366.         prev=${cur/=*/}
  6367.         cur=${cur/*=/}
  6368.         case "$prev" in
  6369.             --@(edit|view|ftplog|printwd))
  6370.                 _filedir
  6371.                 return 0
  6372.                 ;;
  6373.         esac
  6374.     fi
  6375.  
  6376.     if [[ "$cur" == -* ]]; then
  6377.         COMPREPLY=( $( compgen -W '-a --stickchars -b --nocolor -c \
  6378.             --color -C --colors= -d --nomouse -e --edit= -f \
  6379.             --datadir -k --resetsoft -l --ftplog= -P --printwd= \
  6380.             -s --slow -t --termcap -u --nosubshell -U --subshell \
  6381.             -v --view= -V --version -x --xterm -h --help' -- $cur ) )
  6382.     else
  6383.         _filedir -d
  6384.     fi
  6385. } &&
  6386. complete -F _mc $filenames mc
  6387.  
  6388. # yum(8) completion
  6389. #
  6390. have yum && {
  6391. _yum()
  6392. {
  6393.     local cur prev special
  6394.     
  6395.     COMPREPLY=()
  6396.     cur=`_get_cword`
  6397.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6398.  
  6399.     for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
  6400.         if [[ ${COMP_WORDS[i]} == @(install|update|upgrade|remove|erase|deplist) ]]; then
  6401.             special=${COMP_WORDS[i]}
  6402.         fi
  6403.     done
  6404.  
  6405.     if [ -n "$special" ]; then
  6406.         case $special in
  6407.         install|deplist)
  6408.             COMPREPLY=( $( compgen -W '$( yum -C list | cut -d" " -f1 )' -- $cur ) )
  6409.             return 0
  6410.             ;;
  6411.         *)
  6412.             _rpm_installed_packages
  6413.             return 0
  6414.             ;;
  6415.         esac
  6416.     fi
  6417.  
  6418.     case $cur in
  6419.         --*)
  6420.         COMPREPLY=( $( compgen -W '--installroot --version --help --enablerepo --disablerepo --exclude --obsoletes --noplugins' -- $cur ) )
  6421.         return 0
  6422.         ;;
  6423.         -*)
  6424.         COMPREPLY=( $( compgen -W '-c -e -d -y -t -R -C -h' -- $cur ) )
  6425.         return 0
  6426.         ;;
  6427.     esac
  6428.  
  6429.     case $prev in
  6430.         list)
  6431.         COMPREPLY=( $( compgen -W 'all available updates installed extras obsoletes recent' -- $cur ) )
  6432.         ;;
  6433.         clean)
  6434.         COMPREPLY=( $( compgen -W 'packages headers metadata cache dbcache all' -- $cur ) )
  6435.         ;;
  6436.         localinstall)
  6437.         _filedir rpm
  6438.         ;;
  6439.         -c)
  6440.         _filedir
  6441.         ;;
  6442.         --installroot)
  6443.         _filedir -d
  6444.         ;;
  6445.         *)
  6446.         COMPREPLY=( $( compgen -W 'install update check-update upgrade remove list \
  6447.                         search info provides clean groupinstall groupupdate \
  6448.                         grouplist deplist erase groupinfo groupremove \
  6449.                         localinstall localupdate makecache resolvedep \
  6450.                         shell whatprovides' -- $cur ) )
  6451.         ;;
  6452.     esac
  6453. }
  6454. complete -F _yum $filenames yum
  6455.  
  6456. # yum-arch(8) completion
  6457. #
  6458. _yum_arch()
  6459. {
  6460.     local cur
  6461.     COMPREPLY=()
  6462.     cur=`_get_cword`
  6463.  
  6464.     case "$cur" in
  6465.     -*)
  6466.         COMPREPLY=( $( compgen -W '-d -v -vv -n -c -z -s -l -q' -- $cur ) )
  6467.         ;;
  6468.     *)
  6469.         _filedir -d
  6470.         ;;
  6471.     esac
  6472.  
  6473.     return 0
  6474.  
  6475. }
  6476. complete -F _yum_arch $filenames yum-arch
  6477. }
  6478.  
  6479. # ImageMagick completion
  6480. #
  6481. have convert && {
  6482. _ImageMagick()
  6483. {
  6484.     local prev
  6485.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6486.  
  6487.     case "$prev" in
  6488.         -channel)
  6489.             COMPREPLY=( $( compgen -W 'Red Green Blue Opacity \
  6490.                 Matte Cyan Magenta Yellow Black' -- $cur ) )
  6491.             return 0
  6492.             ;;
  6493.         -colormap)
  6494.             COMPREPLY=( $( compgen -W 'shared private' -- $cur ) )
  6495.             return 0
  6496.             ;;
  6497.         -colorspace)
  6498.             COMPREPLY=( $( compgen -W 'GRAY OHTA RGB Transparent \
  6499.                 XYZ YCbCr YIQ YPbPr YUV CMYK' -- $cur ) )
  6500.             return 0
  6501.             ;;
  6502.         -compose)
  6503.             COMPREPLY=( $( compgen -W 'Over In Out Atop Xor Plus \
  6504.                 Minus Add Subtract Difference Multiply Bumpmap\
  6505.                 Copy CopyRed CopyGreen CopyBlue CopyOpacity' \
  6506.                 -- $cur ) )
  6507.             return 0
  6508.             ;;
  6509.         -compress)
  6510.             COMPREPLY=( $( compgen -W 'None BZip Fax Group4 JPEG \
  6511.                 Lossless LZW RLE Zip' -- $cur ) )
  6512.             return 0
  6513.             ;;
  6514.         -dispose)
  6515.             COMPREPLY=( $( compgen -W 'Undefined None Background \
  6516.                             Previous' -- $cur ) )
  6517.             return 0
  6518.             ;;
  6519.         -encoding)
  6520.             COMPREPLY=( $( compgen -W 'AdobeCustom AdobeExpert \
  6521.                 AdobeStandard AppleRoman BIG5 GB2312 Latin2 \
  6522.                 None SJIScode Symbol Unicode Wansung' -- $cur))
  6523.             return 0
  6524.             ;;
  6525.         -endian)
  6526.             COMPREPLY=( $( compgen -W 'MSB LSB' -- $cur ) )
  6527.             return 0
  6528.             ;;
  6529.         -filter)
  6530.             COMPREPLY=( $( compgen -W 'Point Box Triangle Hermite \
  6531.                 Hanning Hamming Blackman Gaussian Quadratic \
  6532.                 Cubic Catrom Mitchell Lanczos Bessel Sinc' \
  6533.                 -- $cur ) )
  6534.             return 0
  6535.             ;;
  6536.         -format)
  6537.             COMPREPLY=( $( convert -list format | \
  6538.                     awk '/ [r-][w-][+-] / {print $1}' | \
  6539.                     tr -d '*' | tr [:upper:] [:lower:] | \
  6540.                     grep "^$cur" ) )
  6541.             return 0
  6542.             ;;
  6543.         -gravity)
  6544.             COMPREPLY=( $( compgen -W 'Northwest North NorthEast \
  6545.                 West Center East SouthWest South SouthEast' \
  6546.                 -- $cur ) )
  6547.             return 0
  6548.             ;;
  6549.         -intent)
  6550.             COMPREPLY=( $( compgen -W 'Absolute Perceptual \
  6551.                     Relative Saturation' -- $cur ) )
  6552.             return 0
  6553.             ;;
  6554.         -interlace)
  6555.             COMPREPLY=( $( compgen -W 'None Line Plane Partition' \
  6556.                     -- $cur ) )
  6557.             return 0
  6558.             ;;
  6559.         -limit)
  6560.             COMPREPLY=( $( compgen -W 'Disk File Map Memory' \
  6561.                     -- $cur ) )
  6562.             return 0
  6563.             ;;
  6564.         -list)
  6565.             COMPREPLY=( $( compgen -W 'Delegate Format Magic \
  6566.                     Module Resource Type' -- $cur ) )
  6567.             return 0
  6568.             ;;
  6569.         -map)
  6570.             COMPREPLY=( $( compgen -W 'best default gray red \
  6571.                     green blue' -- $cur ) )
  6572.             _filedir
  6573.             return 0
  6574.             ;;
  6575.         -noise)
  6576.             COMPREPLY=( $( compgen -W 'Uniform Gaussian \
  6577.                     Multiplicative \
  6578.                 Impulse Laplacian Poisson' -- $cur ) )
  6579.             return 0
  6580.             ;;
  6581.         -preview)
  6582.             COMPREPLY=( $( compgen -W 'Rotate Shear Roll Hue \
  6583.                     Saturation Brightness Gamma Spiff \
  6584.                     Dull Grayscale Quantize Despeckle \
  6585.                     ReduceNoise AddNoise Sharpen Blur \
  6586.                     Treshold EdgeDetect Spread Shade \
  6587.                     Raise Segment Solarize Swirl Implode \
  6588.                     Wave OilPaint CharcoalDrawing JPEG' \
  6589.                     -- $cur ) )
  6590.             return 0
  6591.             ;;
  6592.         -@(mask|profile|texture|tile|write))
  6593.             _filedir
  6594.             return 0
  6595.             ;;
  6596.         -type)
  6597.             COMPREPLY=( $( compgen -W 'Bilevel Grayscale Palette \
  6598.                     PaletteMatte TrueColor TrueColorMatte \
  6599.                     ColorSeparation ColorSeparationlMatte \
  6600.                     Optimize' -- $cur ) )
  6601.             return 0
  6602.             ;;
  6603.         -units)
  6604.             COMPREPLY=( $( compgen -W 'Undefined PixelsPerInch \
  6605.                     PixelsPerCentimeter' -- $cur ) )
  6606.             return 0
  6607.             ;;
  6608.         -virtual-pixel)
  6609.             COMPREPLY=( $( compgen -W 'Constant Edge mirror tile' \
  6610.                     -- $cur ) )
  6611.             return 0
  6612.             ;;
  6613.         -visual)
  6614.             COMPREPLY=( $( compgen -W 'StaticGray GrayScale \
  6615.                     StaticColor PseudoColor TrueColor \
  6616.                     DirectColor defaut visualid' -- $cur ))
  6617.             return 0
  6618.             ;;
  6619.     esac
  6620. }
  6621.  
  6622. _convert()
  6623. {
  6624.     local cur
  6625.  
  6626.     COMPREPLY=()
  6627.     cur=`_get_cword`
  6628.  
  6629.     _ImageMagick
  6630.  
  6631.     if [[ "$cur" == -* ]]; then
  6632.         COMPREPLY=( $( compgen -W '-adjoin -affine -antialias -append \
  6633.             -authenticate -average -background -black-threshold \
  6634.             -blue-primary -blur -border -bordercolor -channel \
  6635.             -charcoal -chop -clip -coalesce -colorize -colors \
  6636.             -colorspace -comment -compress -contrast -convolve \
  6637.             -crop -cycle -debug -deconstruct -delay -density \
  6638.             -depth -despeckle -display -dispose -dither -draw \
  6639.             -edge -emboss -encoding -endian -enhance -equalize \
  6640.             -extract -fill -filter -flatten -flip -flop -font \
  6641.             -frame -fuzz -gamma -gaussian -geometry \
  6642.             -green-primary -gravity -help -implode -intent \
  6643.             -interlace -label -lat -level -limit -list -log -loop \
  6644.             -map -mask -matte -median -modulate -monochrome \
  6645.             -morph -mosaic -negate -noop -noise -normalize \
  6646.             -opaque -ordered-dither -page -paint -ping -pointsize \
  6647.             -preview -profile -quality -raise -random-threshold \
  6648.             -region -raise -red-primary -render -resize -resample \
  6649.             -roll -rotate -sample -sampling-factor -scale -scene \
  6650.             -seed -segment -shade -sharpen -shave -shear -size \
  6651.             -solarize -spread -stroke -strokewidth -swirl \
  6652.             -texture -threshold -thumbnail -tile -transform \
  6653.             -transparent -treedepth -trim -type -undercolor \
  6654.             -units -unsharp -verbose -version -view \
  6655.             -virtual-pixel -wave -white-point -white-threshold \
  6656.             -write' -- $cur ) )
  6657.     elif [[ "$cur" == +* ]]; then
  6658.         COMPREPLY=( $( compgen -W '+adjoin +append +compress \
  6659.             +contrast +debug +dither +endian +gamma +label +map \
  6660.             +mask +matte +negate +noise +page +raise +render \
  6661.             +write' -- $cur ) ) 
  6662.     else
  6663.         _filedir
  6664.     fi
  6665. }
  6666. complete -F _convert $filenames convert
  6667.  
  6668. _mogrify()
  6669. {
  6670.     local cur
  6671.  
  6672.     COMPREPLY=()
  6673.     cur=`_get_cword`
  6674.  
  6675.     _ImageMagick
  6676.  
  6677.     if [[ "$cur" == -* ]]; then
  6678.         COMPREPLY=( $( compgen -W '-affine -antialias -authenticate \
  6679.             -background -black-threshold -blue-primary -blur \
  6680.             -border -bordercolor -channel -charcoal -chop \
  6681.             -colorize -colors -colorspace -comment -compress \
  6682.             -contrast -convolve -crop -cycle -debug -delay \
  6683.             -density -depth -despeckle -display -dispose -dither \
  6684.             -draw -edge -emboss -encoding -endian -enhance \
  6685.             -equalize -extract -fill -filter -flip -flop -font \
  6686.             -format -frame -fuzz -gamma -gaussian -geometry \
  6687.             -green-primary -implode -interlace -help -label -lat \
  6688.             -level -limit -list -log -loop -map -mask -matte \
  6689.             -median -modulate -monochrome -negate -noop \
  6690.             -normalize -opaque -page -paint -fill -ordered-dither \
  6691.             -pointsize -profile -quality -raise -random-threshold \
  6692.             -red-primary -region -resample -resize -roll -rotate \
  6693.             -sample -sampling-factor -scale -scene -seed -segment \
  6694.             -shade -sharpen -shear -size -solarize -spread \
  6695.             -stroke -strokewidth -swirl -texture -threshold \
  6696.             -thumbnail -tile -transform -transparent -treedepth \
  6697.             -trim -type -undercolor -units -unsharp -verbose \
  6698.             -version -view -virtual-pixel -wave -white-point \
  6699.             -white-threshold' -- $cur ) )
  6700.     elif [[ "$cur" == +* ]]; then
  6701.         COMPREPLY=( $( compgen -W '+compress +contrast +debug +dither \
  6702.             +endian +gamma +label +map +mask +matte +negate +page \
  6703.             +raise' -- $cur ) ) 
  6704.     else
  6705.         _filedir
  6706.     fi
  6707. }
  6708. complete -F _mogrify $filenames mogrify
  6709.  
  6710. _display()
  6711. {
  6712.     local cur
  6713.  
  6714.     COMPREPLY=()
  6715.     cur=`_get_cword`
  6716.  
  6717.     _ImageMagick
  6718.  
  6719.     if [[ "$cur" == -* ]]; then
  6720.         COMPREPLY=( $( compgen -W '-authenticate -backdrop -border \
  6721.             -colormap -colors -colorspace -comment -compress \
  6722.             -contrast -crop -debug -delay -density -depth \
  6723.             -despeckle -display -dispose -dither -edge -endian \
  6724.             -enhance -extract -filter -flip -flop -frame -gamma \
  6725.             -geometry -help -immutable -interlace -label -limit \
  6726.             -log -map -matte -monochrome -negate -noop -page \
  6727.             -quality -raise -remote -roll -rotate -sample \
  6728.             -sampling-factor -scene -segment -sharpen -size \
  6729.             -texture -treedepth -trim -update -verbose -version \
  6730.             -virtual-pixel -window -window_group -write' -- $cur))
  6731.     elif [[ "$cur" == +* ]]; then
  6732.         COMPREPLY=( $( compgen -W '+compress +contrast +debug +dither \
  6733.             +endian +gamma +label +map +matte +negate +page \
  6734.             +raise +write' -- $cur ) ) 
  6735.     else
  6736.         _filedir
  6737.     fi
  6738. }
  6739. complete -F _display $filenames display
  6740.  
  6741. _animate()
  6742. {
  6743.     local cur
  6744.  
  6745.     COMPREPLY=()
  6746.     cur=`_get_cword`
  6747.  
  6748.     _ImageMagick
  6749.  
  6750.     if [[ "$cur" == -* ]]; then
  6751.         COMPREPLY=( $( compgen -W '-authenticate -backdrop -colormap \
  6752.             -colors -colorspace -crop -debug -delay -density \
  6753.             -depth -display -dither -extract -gamma -geometry \
  6754.             -help -interlace -limit -log -matte -map -monochrome \
  6755.             -noop -pause -remote -rotate -sampling-factor -scene \
  6756.             -size -treedepth -trim -verbose -version -visual \
  6757.             -virtual-pixel -window' -- $cur ) )
  6758.     elif [[ "$cur" == +* ]]; then
  6759.         COMPREPLY=( $( compgen -W '+debug +dither +gamma +map +matte' -- $cur ) ) 
  6760.     else
  6761.         _filedir
  6762.     fi
  6763. }
  6764. complete -F _animate $filenames animate
  6765.  
  6766. _identify()
  6767. {
  6768.     local cur
  6769.  
  6770.     COMPREPLY=()
  6771.     cur=`_get_cword`
  6772.  
  6773.     _ImageMagick
  6774.  
  6775.     if [[ "$cur" == -* ]]; then
  6776.         COMPREPLY=( $( compgen -W '-authenticate -debug -density \
  6777.             -depth -extract -format -help -interlace -limit -list \
  6778.             -log -size -sampling-factor -verbose -version \
  6779.             -virtual-pixel' -- $cur ) )
  6780.     elif [[ "$cur" == +* ]]; then
  6781.         COMPREPLY=( $( compgen -W '+debug ' -- $cur ) ) 
  6782.     else
  6783.         _filedir
  6784.     fi
  6785. }
  6786. complete -F _identify $filenames identify
  6787.  
  6788. _montage()
  6789. {
  6790.     local cur
  6791.  
  6792.     COMPREPLY=()
  6793.     cur=`_get_cword`
  6794.  
  6795.     _ImageMagick
  6796.  
  6797.     if [[ "$cur" == -* ]]; then
  6798.         COMPREPLY=( $( compgen -W '-adjoin -affine -authenticate \
  6799.             -blue-primary -blur -colors -colorspace -comment \
  6800.             -compose -compress -crop -debug -density -depth \
  6801.             -display -dispose -dither -draw -encoding -endian \
  6802.             -extract -fill -filter -flip -flop -frame -gamma \
  6803.             -geometry -gravity -green-primary -interlace -help \
  6804.             -label -limit -log -matte -mode -monochrome -noop \
  6805.             -page -pointsize -quality -red-primary -resize \
  6806.             -rotate -sampling-factor -scene -shadow -size \
  6807.             -stroke -texture -thumbnail -tile -transform \
  6808.             -transparent -treedepth -trim -type -verbose \
  6809.             -version -virtual-pixel -white-point' -- $cur ) )
  6810.     elif [[ "$cur" == +* ]]; then
  6811.         COMPREPLY=( $( compgen -W '+adjoin +compress +debug +dither \
  6812.             +endian +gamma +label +matte +page' -- $cur ) ) 
  6813.     else
  6814.         _filedir
  6815.     fi
  6816. }
  6817. complete -F _montage $filenames montage
  6818.  
  6819. _composite()
  6820. {
  6821.     local cur
  6822.  
  6823.     COMPREPLY=()
  6824.     cur=`_get_cword`
  6825.  
  6826.     _ImageMagick
  6827.  
  6828.     if [[ "$cur" == -* ]]; then
  6829.         COMPREPLY=( $( compgen -W '-affine -authenticate \
  6830.             -blue-primary -colors -colorspace -comment -compose \
  6831.             -compress -debug -density -depth -displace -display \
  6832.             -dispose -dissolve -dither -encoding -endian -extract \
  6833.             -filter -font -geometry -gravity -green-primary -help \
  6834.             -interlace -label -limit -log -matte -monochrome \
  6835.             -negate -page -profile -quality -red-primary -rotate \
  6836.             -resize -sampling-factor -scene -sharpen -size \
  6837.             -stegano -stereo -thumbnail -tile -transform \
  6838.             -treedepth -type -units -unsharp -verbose -version \
  6839.             -virtual-pixel -watermark -white-point -write' \
  6840.             -- $cur ) )
  6841.     elif [[ "$cur" == +* ]]; then
  6842.         COMPREPLY=( $( compgen -W '+compress +debug +dither +endian +label \
  6843.             +matte +negate +page +write' -- $cur ) ) 
  6844.     else
  6845.         _filedir
  6846.     fi
  6847. }
  6848. complete -F _composite $filenames composite
  6849. }
  6850.  
  6851. # dd(1) completion
  6852. #
  6853. have dd &&
  6854. _dd()
  6855. {
  6856.      local cur
  6857.  
  6858.      COMPREPLY=()
  6859.     cur=`_get_cword`
  6860.  
  6861.      case "$cur" in
  6862.      if=*|of=*)
  6863.          cur=${cur#*=}
  6864.          _filedir
  6865.          return 0
  6866.          ;;
  6867.      conv=*)
  6868.          cur=${cur#*=}
  6869.          COMPREPLY=( $( compgen -W 'ascii ebcdic ibm block unblock \
  6870.                 lcase notrunc ucase swab noerror sync' \
  6871.                 -- $cur ) )
  6872.          return 0
  6873.          ;;
  6874.      esac
  6875.  
  6876.      _expand || return 0
  6877.  
  6878.      COMPREPLY=( $( compgen -W '--help --version' -- $cur ) \
  6879.              $( compgen -W 'bs cbs conv count ibs if obs of seek skip'\
  6880.                 -S '=' -- $cur ) )
  6881. } &&
  6882. complete -F _dd $nospace $filenames dd
  6883.  
  6884. # CUPS cancel(1) completion
  6885. #
  6886. have cancel &&
  6887. _cancel()
  6888. {
  6889.     local cur
  6890.  
  6891.     COMPREPLY=()
  6892.     cur=`_get_cword`
  6893.  
  6894.     COMPREPLY=( $( lpstat | cut -d' ' -f1 | grep "^$cur" ) )
  6895. } &&
  6896. complete -F _cancel $filenames cancel
  6897.  
  6898. # aspell(1) completion
  6899. #
  6900. have aspell && {
  6901. _aspell_dictionary()
  6902. {
  6903.     local datadir
  6904.     datadir=/usr/lib/aspell
  6905.     COMPREPLY=( $( command ls $datadir/*.@(multi|alias) ) )
  6906.     COMPREPLY=( ${COMPREPLY[@]%.@(multi|alias)} )
  6907.     COMPREPLY=( $( compgen -W '${COMPREPLY[@]#$datadir/}' -- $cur ) )
  6908. }
  6909.  
  6910. _aspell()
  6911. {
  6912.     local cur prev
  6913.  
  6914.     COMPREPLY=()
  6915.     cur=`_get_cword`
  6916.     prev=${COMP_WORDS[COMP_CWORD-1]}
  6917.  
  6918.     # --name value style option
  6919.     case "$prev" in
  6920.         @(-c|-p|check))
  6921.             _filedir
  6922.             return 0
  6923.             ;;
  6924.         @(dump|create|merge))
  6925.             COMPREPLY=( $( compgen -W 'master personal repl' -- $cur ) )
  6926.             return 0
  6927.             ;;
  6928.         -d)
  6929.             _aspell_dictionary
  6930.             return 0
  6931.             ;;
  6932.     esac
  6933.  
  6934.     # --name=value style option
  6935.     if [[ "$cur" == *=* ]]; then
  6936.         prev=${cur/=*/}
  6937.         cur=${cur/*=/}
  6938.         case "$prev" in
  6939.             --@(conf|personal|repl|per-conf))
  6940.                 _filedir
  6941.                 return 0
  6942.                 ;;
  6943.             --@(conf-dir|data-dir|dict-dir|home-dir|local-data-dir|prefix))
  6944.                 _filedir -d
  6945.                 return 0
  6946.                 ;;
  6947.             --master)
  6948.                 _aspell_dictionary
  6949.                 return 0
  6950.                 ;;
  6951.             --mode)
  6952.                 COMPREPLY=( $( compgen -W 'none url email sgml tex' -- $cur ) )
  6953.                 return 0
  6954.                 ;; 
  6955.             --sug-mode)
  6956.                 COMPREPLY=( $( compgen -W 'ultra fast normal bad-speller' -- $cur ) )
  6957.                 return 0
  6958.                 ;;
  6959.             --keymapping)
  6960.                 COMPREPLY=( $( compgen -W 'aspell ispell' -- $cur ) )
  6961.                 return 0
  6962.                 ;;
  6963.         esac
  6964.     fi
  6965.  
  6966.     if [[ "$cur" == -* ]]; then
  6967.         COMPREPLY=( $( compgen -W '--conf= --conf-dir= --data-dir= --dict-dir= \
  6968.             --encoding= --add-filter= --rem-filter= --mode= -e \
  6969.             -H -t --add-extra-dicts= --rem-extra-dicts= \
  6970.             --home-dir= -W --ignore= --ignore-accents \
  6971.             --dont-ignore-accents --ignore-case --dont-ignore-case \
  6972.             --ignore-repl --dont-ignore-repl --jargon= --keyboard= \
  6973.             --lang= --language-tag= --local-data-dir= -d --master= \
  6974.             --module= --add-module-search-order= \
  6975.             --rem-module-search-order= --per-conf= -p --personal= \
  6976.             --prefix= --repl= -C -B --run-together --dont-run-together \
  6977.             --run-together-limit= --run-together-min= --save-repl \
  6978.             --dont-save-repl --set-prefix --dont-set-prefix --size= \
  6979.             --spelling= --strip-accents --dont-strip-accents \
  6980.             --sug-mode= --add-word-list-path= --rem-word-list-path= \
  6981.             -b -x --backup -b|-x --dont-backup --reverse --dont-reverse \
  6982.             --time --dont-time --keymapping= --add-email-quote= \
  6983.             --rem-email-quote= --email-margin= --add-tex-command= \
  6984.             --rem-tex-command= --tex-check-comments \
  6985.             --dont-tex-check-comments --add-tex-extension= \
  6986.             --rem-tex-extension= --add-sgml-check= --rem-sgml-check= \
  6987.             --add-sgml-extension= --rem-sgml-extension=' -- $cur ) )
  6988.     else
  6989.         COMPREPLY=( $( compgen -W '-? help -c check -a pipe -l list \
  6990.             config config soundslike filter -v version dump \
  6991.             create merge' -- $cur ) )
  6992.     fi
  6993.  
  6994. }
  6995. complete -F _aspell $filenames aspell
  6996. }
  6997.  
  6998. # xmms(1) completion
  6999. #
  7000. have xmms &&
  7001. _xmms()
  7002. {
  7003.     local cur
  7004.  
  7005.     COMPREPLY=()
  7006.     cur=`_get_cword`
  7007.  
  7008.     if [[ "$cur" == -* ]]; then
  7009.         COMPREPLY=( $( compgen -W '-h --help -r --rew -p --play \
  7010.             -u --pause -s --stop -t --play-pause -f --fwd -e \
  7011.             --enqueue -m --show-main-window -i --sm-client-id \
  7012.             -v --version' -- $cur ) )
  7013.     else
  7014.         _filedir '@(mp[23]|MP[23]|ogg|OGG|wav|WAV|pls|m3u|xm|mod|s[3t]m|it|mtm|ult|flac)'
  7015.  
  7016.     fi
  7017.  
  7018. } &&
  7019. complete -F _xmms $filenames xmms
  7020.  
  7021. # info(1) completion
  7022. #
  7023. have info &&
  7024. _info()
  7025. {
  7026.     local cur infopath UNAME
  7027.  
  7028.     COMPREPLY=()
  7029.     cur=`_get_cword`
  7030.  
  7031.     _expand || return 0
  7032.  
  7033.     # default completion if parameter contains /
  7034.     if [[ "$cur" == */* ]]; then
  7035.         _filedir
  7036.         return 0
  7037.     fi
  7038.  
  7039.     infopath='/usr/share/info'
  7040.  
  7041.     if [ "${INFOPATH: -1:1}" == ':' ]; then
  7042.         infopath=${INFOPATH}${infopath}
  7043.     elif [ ${INFOPATH:+set} ]; then
  7044.         infopath=$INFOPATH
  7045.     fi
  7046.  
  7047.     infopath=$infopath:
  7048.     if [ -n "$cur" ]; then
  7049.         infopath="${infopath//://$cur* }"
  7050.     else
  7051.         infopath="${infopath//:// }"
  7052.     fi
  7053.  
  7054.     # redirect stderr for when path doesn't exist
  7055.     COMPREPLY=( $( eval command ls "$infopath" 2>/dev/null ) )
  7056.     # weed out directory path names and paths to info pages
  7057.     COMPREPLY=( ${COMPREPLY[@]##*/?(:)} )
  7058.     # weed out info dir file
  7059.     for (( i=0 ; i < ${#COMPREPLY[@]} ; ++i )); do
  7060.         if [ "${COMPREPLY[$i]}" == 'dir' ]; then
  7061.             unset COMPREPLY[$i];
  7062.         fi;
  7063.     done  
  7064.     # strip suffix from info pages
  7065.     COMPREPLY=( ${COMPREPLY[@]%.@(gz|bz2)} )
  7066.     COMPREPLY=( $( compgen -W '${COMPREPLY[@]%.*}' -- "${cur//\\\\/}" ) )
  7067.  
  7068.     return 0
  7069. } &&
  7070. complete -F _info $filenames info
  7071.  
  7072. # dhclient(1) completion
  7073. #
  7074. have dhclient && _dhclient()
  7075. {
  7076.     local cur prev
  7077.  
  7078.     COMPREPLY=()
  7079.     cur=`_get_cword`
  7080.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7081.  
  7082.     case "$prev" in
  7083.         -@(cf|lf|pf|sf))
  7084.             _filedir
  7085.             return 0
  7086.             ;;
  7087.         -s)
  7088.             _known_hosts
  7089.             return 0
  7090.             ;;
  7091.     esac
  7092.  
  7093.     if [[ "$cur" == -* ]]; then
  7094.         COMPREPLY=( $( compgen -W '-p -d -q -1 -r -lf -pf \
  7095.             -cf -sf -s -g -n -nw -w' -- $cur ) )
  7096.     else
  7097.         _available_interfaces
  7098.     fi
  7099. } &&
  7100. complete -F _dhclient dhclient
  7101.  
  7102. # lvm(8) completion
  7103. #
  7104. have lvm && {
  7105. _volumegroups()
  7106. {
  7107.     COMPREPLY=( $(compgen -W "$( vgscan 2>/dev/null | \
  7108.         sed -n -e 's|.*Found.*"\(.*\)".*$|\1|p' )" -- $cur ) )
  7109. }
  7110.  
  7111. _physicalvolumes()
  7112. {
  7113.     COMPREPLY=( $(compgen -W "$( pvscan 2>/dev/null | \
  7114.         sed -n -e 's|^.*PV \(.*\) VG.*$|\1|p' )" -- $cur ) )
  7115. }
  7116.  
  7117. _logicalvolumes()
  7118. {
  7119.     COMPREPLY=( $(compgen -W "$( lvscan 2>/dev/null | \
  7120.         sed -n -e "s|^.*'\(.*\)'.*$|\1|p" )" -- $cur ) )
  7121. }
  7122.  
  7123. _units()
  7124. {
  7125.     COMPREPLY=( $( compgen -W 'h s b k m g t H K M G T' -- $cur ) )
  7126. }
  7127.  
  7128. _sizes()
  7129. {
  7130.     COMPREPLY=( $( compgen -W 'k K m M g G t T' -- $cur ) )
  7131. }
  7132.  
  7133. _args()
  7134. {
  7135.     args=0
  7136.     if [[ "${COMP_WORDS[0]}" == lvm ]]; then
  7137.         offset=2
  7138.     else
  7139.         offset=1
  7140.     fi
  7141.     for (( i=$offset; i < COMP_CWORD; i++ )); do
  7142.         if [[ "${COMP_WORDS[i]}" != -* ]]; then
  7143.             args=$(($args + 1))
  7144.         fi
  7145.     done
  7146. }
  7147.  
  7148. _lvmdiskscan()
  7149. {
  7150.     local cur
  7151.  
  7152.     COMPREPLY=()
  7153.     cur=`_get_cword`
  7154.  
  7155.     if [[ "$cur" == -* ]]; then
  7156.         COMPREPLY=( $( compgen -W '-d --debug -h -? --help -l \
  7157.             --lvmpartition -v --verbose --version' -- $cur ) )
  7158.     fi
  7159. }
  7160. complete -F _lvmdiskscan lvmdiskscan
  7161.  
  7162. _pvscan()
  7163. {
  7164.     local cur
  7165.  
  7166.     COMPREPLY=()
  7167.     cur=`_get_cword`
  7168.  
  7169.     if [[ "$cur" == -* ]]; then
  7170.         COMPREPLY=( $( compgen -W '-d --debug -e \
  7171.             --exported -n --novolumegroup -h -? \
  7172.             --help --ignorelockingfailure -P \
  7173.             --partial -s --short -u --uuid -v \
  7174.             --verbose --version' -- $cur ) )
  7175.     fi
  7176. }
  7177. complete -F _pvscan pvscan
  7178.  
  7179. _pvs()
  7180. {
  7181.     local cur prev
  7182.  
  7183.     COMPREPLY=()
  7184.     cur=`_get_cword`
  7185.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7186.  
  7187.     case "$prev" in
  7188.         -@(o|O|-options|-sort))
  7189.             COMPREPLY=( $( compgen -W 'pv_fmt pv_uuid \
  7190.                 pv_size pv_free pv_used pv_name \
  7191.                 pv_attr pv_pe_count \
  7192.                 pv_pe_alloc_count' -- $cur ) )
  7193.             return 0
  7194.             ;;
  7195.         --units)
  7196.             _units
  7197.             return 0
  7198.             ;;
  7199.     esac
  7200.  
  7201.     if [[ "$cur" == -* ]]; then
  7202.         COMPREPLY=( $( compgen -W '--aligned -a --all -d --debug \
  7203.             -h -? --help --ignorelockingfailure --noheadings \
  7204.             --nosuffix -o --options -O --sort \
  7205.             --separator --unbuffered --units \
  7206.             -v --verbose --version' -- $cur ) )
  7207.     else
  7208.         _physicalvolumes
  7209.     fi
  7210. }
  7211. complete -F _pvs pvs
  7212.  
  7213. _pvdisplay()
  7214. {
  7215.     local cur prev
  7216.  
  7217.     COMPREPLY=()
  7218.     cur=`_get_cword`
  7219.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7220.  
  7221.     case "$prev" in
  7222.         --units)
  7223.             _units
  7224.             return 0
  7225.             ;;
  7226.     esac
  7227.  
  7228.     if [[ "$cur" == -* ]]; then
  7229.         COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \
  7230.             -v --verbose -d --debug -h --help --version' -- $cur ) )
  7231.     else
  7232.         _physicalvolumes
  7233.     fi
  7234. }
  7235. complete -F _pvdisplay pvdisplay
  7236.  
  7237. _pvchange()
  7238. {
  7239.     local cur prev
  7240.  
  7241.     COMPREPLY=()
  7242.     cur=`_get_cword`
  7243.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7244.  
  7245.     case "$prev" in
  7246.         -@(A|x|-autobackup|--allocatable))
  7247.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7248.             return 0
  7249.             ;;
  7250.     esac
  7251.  
  7252.     if [[ "$cur" == -* ]]; then
  7253.         COMPREPLY=( $( compgen -W '-a --all -A --autobackup \
  7254.             -d --debug -h --help -t --test -u --uuid -x \
  7255.             --allocatable -v --verbose --addtag --deltag \
  7256.             --version' -- $cur ) )
  7257.     else
  7258.         _physicalvolumes
  7259.     fi
  7260. }
  7261. complete -F _pvchange pvchange
  7262.  
  7263. _pvcreate()
  7264. {
  7265.     local cur prev
  7266.  
  7267.     COMPREPLY=()
  7268.     cur=`_get_cword`
  7269.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7270.  
  7271.     case "$prev" in
  7272.         --restorefile)
  7273.             _filedir
  7274.             return 0
  7275.             ;;
  7276.         -@(M|-metadatatype))
  7277.             COMPREPLY=( $( compgen -W '1 2' -- $cur ) )
  7278.             return 0
  7279.             ;;
  7280.         --metadatacopies)
  7281.             COMPREPLY=( $( compgen -W '0 1 2' -- $cur ) )
  7282.             return 0
  7283.             ;;
  7284.         --@(metadatasize|setphysicalvolumesize))
  7285.             _sizes
  7286.             return 0
  7287.             ;;
  7288.     esac
  7289.  
  7290.     if [[ "$cur" == -* ]]; then
  7291.         COMPREPLY=( $( compgen -W '--restorefile -d --debug -f \
  7292.             --force -h -? --help --labelsector -M --metadatatype \
  7293.             --metadatacopies --metadatasize \
  7294.             --setphysicalvolumesize -t --test -u --uuid uuid -v \
  7295.             --verbose -y --yes --version' -- $cur ) )
  7296.     else
  7297.         _physicalvolumes
  7298.     fi
  7299. }
  7300. complete -F _pvcreate pvcreate
  7301.  
  7302. _pvmove()
  7303. {
  7304.     local cur prev
  7305.  
  7306.     COMPREPLY=()
  7307.     cur=`_get_cword`
  7308.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7309.  
  7310.     case "$prev" in
  7311.         -@(A|-autobackup))
  7312.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7313.             return 0
  7314.             ;;
  7315.         -@(n|-name))
  7316.             _logicalvolumes
  7317.             return 0
  7318.     esac
  7319.  
  7320.     if [[ "$cur" == -* ]]; then
  7321.         COMPREPLY=( $( compgen -W '--abort -A --autobackup \
  7322.             -b --background -d --debug -f --force -h -? \
  7323.             --help -i --interval -t --test -v --verbose \
  7324.             --version -n --name' -- $cur ) )
  7325.     else
  7326.         _physicalvolumes
  7327.     fi
  7328. }
  7329. complete -F _pvmove pvmove
  7330.  
  7331. _pvremove()
  7332. {
  7333.     local cur
  7334.  
  7335.     COMPREPLY=()
  7336.     cur=`_get_cword`
  7337.  
  7338.     if [[ "$cur" == -* ]]; then
  7339.         COMPREPLY=( $( compgen -W '-d --debug -f --force -h -? \
  7340.             --help -y --yes -t --test -v --verbose \
  7341.             --version' -- $cur ) )
  7342.     else
  7343.         _physicalvolumes
  7344.     fi
  7345. }
  7346. complete -F _pvremove pvremove
  7347.  
  7348. _vgscan()
  7349. {
  7350.     local cur
  7351.  
  7352.     COMPREPLY=()
  7353.     cur=`_get_cword`
  7354.  
  7355.     if [[ "$cur" == -* ]]; then
  7356.         COMPREPLY=( $( compgen -W '-d --debug -h --help \
  7357.             --ignorelockingfailure --mknodes -P \
  7358.             --partial -v --verbose --version' -- $cur ) )
  7359.     fi
  7360. }
  7361. complete -F _vgscan vgscan
  7362.  
  7363. _vgs()
  7364. {
  7365.     local cur prev
  7366.  
  7367.     COMPREPLY=()
  7368.     cur=`_get_cword`
  7369.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7370.  
  7371.     case "$prev" in
  7372.         -@(o|O|-options|-sort))
  7373.             COMPREPLY=( $( compgen -W 'vg_fmt vg_uuid vg_name \
  7374.                 vg_attr vg_size vg_free vg_sysid \
  7375.                 vg_extent_size vg_extent_count vg_free_count \
  7376.                 max_lv max_pv pv_count lv_count snap_count \
  7377.                 vg_seqno' -- $cur ) )
  7378.             return 0
  7379.             ;;
  7380.         --units)
  7381.             _units
  7382.             return 0
  7383.             ;;
  7384.     esac
  7385.  
  7386.     if [[ "$cur" == -* ]]; then
  7387.         COMPREPLY=( $( compgen -W '--aligned -d --debug \
  7388.             -h --help --ignorelockingfailure --noheadings \
  7389.             --nosuffix -o --options -O --sort -P --partial \
  7390.             --separator --unbuffered --units \
  7391.             -v --verbose --version' -- $cur ) )
  7392.     else
  7393.         _volumegroups
  7394.     fi
  7395. }
  7396. complete -F _vgs vgs
  7397.  
  7398. _vgdisplay()
  7399. {
  7400.     local cur prev
  7401.  
  7402.     COMPREPLY=()
  7403.     cur=`_get_cword`
  7404.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7405.  
  7406.     case "$prev" in
  7407.         --units)
  7408.             _units
  7409.             return 0
  7410.             ;;
  7411.     esac
  7412.  
  7413.     if [[ "$cur" == -* ]]; then
  7414.         COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \
  7415.             -P --partial -A --activevolumegroups -v --verbose \
  7416.             -d --debug -h --help --version' -- $cur ) )
  7417.     else
  7418.         _volumegroups
  7419.     fi
  7420. }
  7421. complete -F _vgdisplay vgdisplay
  7422.  
  7423. _vgchange()
  7424. {
  7425.     local cur prev
  7426.  
  7427.     COMPREPLY=()
  7428.     cur=`_get_cword`
  7429.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7430.  
  7431.     case "$prev" in
  7432.         -@(a|A|x|-available|-autobackup|-resizeable))
  7433.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7434.             return 0
  7435.             ;;
  7436.     esac
  7437.  
  7438.     if [[ "$cur" == -* ]]; then
  7439.         COMPREPLY=( $( compgen -W '-A --autobackup --alloc -P \
  7440.             --partial -d --debug -h --help --ignorelockingfailure \
  7441.             -t --test -u --uuid -v --verbose --version -a \
  7442.             --available -x --resizeable -l --logicalvolume \
  7443.             --addtag --deltag' -- $cur ) )
  7444.     else
  7445.         _volumegroups
  7446.     fi
  7447. }
  7448. complete -F _vgchange vgchange
  7449.  
  7450. _vgcreate()
  7451. {
  7452.     local cur prev
  7453.  
  7454.     COMPREPLY=()
  7455.     cur=`_get_cword`
  7456.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7457.  
  7458.     case "$prev" in
  7459.         -@(A|-autobackup))
  7460.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7461.             return 0
  7462.             ;;
  7463.         -@(M|-metadatatype))
  7464.             COMPREPLY=( $( compgen -W '1 2' -- $cur ) )
  7465.             return 0
  7466.             ;;
  7467.         -@(s|-physicalextentsize))
  7468.             _sizes
  7469.             return 0
  7470.             ;;
  7471.     esac
  7472.  
  7473.     if [[ "$cur" == -* ]]; then
  7474.         COMPREPLY=( $( compgen -W '-A --autobackup --addtag \
  7475.             --alloc -d --debug -h --help -l --maxlogicalvolumes \
  7476.             -M --metadatatype -p --maxphysicalvolumes -s \
  7477.             --physicalextentsize -t --test -v --verbose \
  7478.             --version' -- $cur ) )
  7479.     else
  7480.         _args
  7481.         if [ $args -eq 0 ]; then
  7482.             _volumegroups
  7483.         else
  7484.             _physicalvolumes
  7485.         fi
  7486.     fi
  7487. }
  7488. complete -F _vgcreate vgcreate
  7489.  
  7490. _vgremove()
  7491. {
  7492.     local cur
  7493.  
  7494.     COMPREPLY=()
  7495.     cur=`_get_cword`
  7496.  
  7497.     if [[ "$cur" == -* ]]; then
  7498.         COMPREPLY=( $( compgen -W '-d --debug -h --help -t --test \
  7499.         -v --verbose --version' -- $cur ) )
  7500.     else
  7501.         _volumegroups
  7502.     fi
  7503. }
  7504. complete -F _vgremove vgremove
  7505.  
  7506. _vgrename()
  7507. {
  7508.     local cur prev
  7509.  
  7510.     COMPREPLY=()
  7511.     cur=`_get_cword`
  7512.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7513.  
  7514.     case "$prev" in
  7515.         -@(A|-autobackup))
  7516.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7517.             return 0
  7518.             ;;
  7519.     esac
  7520.  
  7521.     if [[ "$cur" == -* ]]; then
  7522.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \
  7523.             -? --help -t --test -v --verbose --version' -- $cur ) )
  7524.     else
  7525.         _volumegroups
  7526.     fi
  7527. }
  7528. complete -F _vgrename vgrename
  7529.  
  7530. _vgreduce()
  7531. {
  7532.     local cur prev
  7533.  
  7534.     COMPREPLY=()
  7535.     cur=`_get_cword`
  7536.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7537.  
  7538.     case "$prev" in
  7539.         -@(A|-autobackup))
  7540.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7541.             return 0
  7542.             ;;
  7543.     esac
  7544.  
  7545.     if [[ "$cur" == -* ]]; then
  7546.         COMPREPLY=( $( compgen -W '-a --all -A --autobackup -d \
  7547.             --debug -h --help --removemissing -t --test -v \
  7548.             --verbose --version' -- $cur ) )
  7549.  
  7550.     else
  7551.         _args
  7552.         if [ $args -eq 0 ]; then
  7553.             _volumegroups
  7554.         else
  7555.             _physicalvolumes
  7556.         fi
  7557.     fi
  7558. }
  7559. complete -F _vgreduce vgreduce
  7560.  
  7561. _vgextend()
  7562. {
  7563.     local cur prev
  7564.  
  7565.     COMPREPLY=()
  7566.     cur=`_get_cword`
  7567.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7568.  
  7569.     case "$prev" in
  7570.         -@(A|-autobackup))
  7571.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7572.             return 0
  7573.             ;;
  7574.         -@(L|-size))
  7575.             _sizes
  7576.             return 0
  7577.             ;;
  7578.     esac
  7579.  
  7580.     if [[ "$cur" == -* ]]; then
  7581.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \
  7582.             -? --help -t --test -v --verbose --version' -- $cur ) )
  7583.     else
  7584.         _args
  7585.         if [ $args -eq 0 ]; then
  7586.             _volumegroups
  7587.         else
  7588.             _physicalvolumes
  7589.         fi
  7590.     fi
  7591. }
  7592. complete -F _vgextend vgextend
  7593.  
  7594. _vgport()
  7595. {
  7596.     local cur prev
  7597.  
  7598.     COMPREPLY=()
  7599.     cur=`_get_cword`
  7600.  
  7601.     if [[ "$cur" == -* ]]; then
  7602.         COMPREPLY=( $( compgen -W '-a --all -d --debug -h \
  7603.             -? --help -v --verbose --version' -- $cur ) )
  7604.     else
  7605.         _volumegroups
  7606.     fi
  7607. }
  7608. complete -F _vgport vgimport vgexport
  7609.  
  7610. _vgck()
  7611. {
  7612.     local cur prev
  7613.  
  7614.     COMPREPLY=()
  7615.     cur=`_get_cword`
  7616.  
  7617.     if [[ "$cur" == -* ]]; then
  7618.         COMPREPLY=( $( compgen -W '-d --debug -h \
  7619.             -? --help -v --verbose --version' -- $cur ) )
  7620.     else
  7621.         _volumegroups
  7622.     fi
  7623. }
  7624. complete -F _vgck vgck
  7625.  
  7626. _vgconvert()
  7627. {
  7628.     local cur prev
  7629.  
  7630.     COMPREPLY=()
  7631.     cur=`_get_cword`
  7632.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7633.  
  7634.     case "$prev" in
  7635.         -@(M|-metadatatype))
  7636.             COMPREPLY=( $( compgen -W '1 2' -- $cur ) )
  7637.             return 0
  7638.             ;;
  7639.         --metadatacopies)
  7640.             COMPREPLY=( $( compgen -W '0 1 2' -- $cur ) )
  7641.             return 0
  7642.             ;;
  7643.         --metadatasize)
  7644.             _sizes
  7645.             return 0
  7646.             ;;
  7647.     esac
  7648.  
  7649.     if [[ "$cur" == -* ]]; then
  7650.         COMPREPLY=( $( compgen -W '-d --debug -h --help --labelsector \ 
  7651.             -M --metadatatype --metadatacopies --metadatasize \
  7652.             -t --test -v --verbose --version' -- $cur ) )
  7653.     else
  7654.         _volumegroups
  7655.     fi
  7656. }
  7657. complete -F _vgconvert vgconvert
  7658.  
  7659. _vgcfgbackup()
  7660. {
  7661.     local cur prev
  7662.  
  7663.     COMPREPLY=()
  7664.     cur=`_get_cword`
  7665.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7666.  
  7667.     case "$prev" in
  7668.         -@(f|-file))
  7669.             _filedir
  7670.             return 0
  7671.             ;;
  7672.     esac
  7673.  
  7674.     if [[ "$cur" == -* ]]; then
  7675.         COMPREPLY=( $( compgen -W '-d --debug -f --file -h --help \
  7676.             --ignorelockingfailure -P --partial -v --verbose \
  7677.             --version' -- $cur ) )
  7678.     else
  7679.         _volumegroups
  7680.     fi
  7681. }
  7682. complete -F _vgcfgbackup vgcfgbackup
  7683.  
  7684. _vgcfgrestore()
  7685. {
  7686.     local cur prev
  7687.  
  7688.     COMPREPLY=()
  7689.     cur=`_get_cword`
  7690.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7691.  
  7692.     case "$prev" in
  7693.         -@(f|-file))
  7694.             _filedir
  7695.             return 0
  7696.             ;;
  7697.         -@(M|-metadatatype))
  7698.             COMPREPLY=( $( compgen -W '1 2' -- $cur ) )
  7699.             return 0
  7700.             ;;
  7701.         -@(n|-name))
  7702.             _volumegroups
  7703.             return 0
  7704.             ;;
  7705.     esac
  7706.  
  7707.     if [[ "$cur" == -* ]]; then
  7708.         COMPREPLY=( $( compgen -W '-d --debug -f --file -l --list \
  7709.             -h --help -M --Metadatatype -n --name -t --test \
  7710.             -v --verbose --version' -- $cur ) )
  7711.     else
  7712.         _volumegroups
  7713.     fi
  7714. }
  7715. complete -F _vgcfgrestore vgcfgrestore
  7716.  
  7717. _vgmerge()
  7718. {
  7719.     local cur prev
  7720.  
  7721.     COMPREPLY=()
  7722.     cur=`_get_cword`
  7723.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7724.  
  7725.     case "$prev" in
  7726.         -@(A|-autobackup))
  7727.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7728.             return 0
  7729.             ;;
  7730.     esac
  7731.  
  7732.     if [[ "$cur" == -* ]]; then
  7733.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug \
  7734.             -h --help -l --list -t --test -v --verbose \
  7735.             --version' -- $cur ) )
  7736.     else
  7737.         _volumegroups
  7738.     fi
  7739. }
  7740. complete -F _vgmerge vgmerge
  7741.  
  7742. _vgsplit()
  7743. {
  7744.     local cur prev
  7745.  
  7746.     COMPREPLY=()
  7747.     cur=`_get_cword`
  7748.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7749.  
  7750.     case "$prev" in
  7751.         -@(A|-autobackup))
  7752.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7753.             return 0
  7754.             ;;
  7755.         -@(M|-metadatatype))
  7756.             COMPREPLY=( $( compgen -W '1 2' -- $cur ) )
  7757.             return 0
  7758.             ;;
  7759.     esac
  7760.  
  7761.     if [[ "$cur" == -* ]]; then
  7762.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug \
  7763.             -h --help -l --list -M --metadatatype -t --test \
  7764.             -v --verbose --version' -- $cur ) )
  7765.     else
  7766.         _args
  7767.         if [ $args -eq 0 -o $args -eq 1 ]; then
  7768.             _volumegroups
  7769.         else
  7770.             _physicalvolumes
  7771.         fi
  7772.     fi
  7773. }
  7774. complete -F _vgsplit vgsplit
  7775.  
  7776. _vgmknodes()
  7777. {
  7778.     local cur
  7779.  
  7780.     COMPREPLY=()
  7781.     cur=`_get_cword`
  7782.  
  7783.     if [[ "$cur" == -* ]]; then
  7784.         COMPREPLY=( $( compgen -W '-d --debug -h --help -v --verbose \
  7785.             --version' -- $cur ) )
  7786.     else
  7787.         _volumegroups
  7788.     fi
  7789. }
  7790. complete -F _vgmknodes vgmknodes
  7791.  
  7792. _lvscan()
  7793. {
  7794.     local cur
  7795.  
  7796.     COMPREPLY=()
  7797.     cur=`_get_cword`
  7798.  
  7799.     if [[ "$cur" == -* ]]; then
  7800.         COMPREPLY=( $( compgen -W '-b --blockdevice -d --debug \
  7801.             -h -? --help --ignorelockingfailure -P \
  7802.             --partial -v --verbose --version' -- $cur ) )
  7803.     fi
  7804. }
  7805. complete -F _lvscan lvscan
  7806.  
  7807. _lvs()
  7808. {
  7809.     local cur prev
  7810.  
  7811.     COMPREPLY=()
  7812.     cur=`_get_cword`
  7813.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7814.  
  7815.     case "$prev" in
  7816.         -@(o|O|-options|-sort))
  7817.             COMPREPLY=( $( compgen -W 'lv_uuid lv_name \
  7818.                 lv_attr lv_minor lv_size seg_count \
  7819.                 origin snap_percent segtype stripes \
  7820.                 stripesize chunksize seg_start \
  7821.                 seg_size' -- $cur ) )
  7822.             return 0
  7823.             ;;
  7824.         --units)
  7825.             _units
  7826.             return 0
  7827.             ;;
  7828.     esac
  7829.  
  7830.     if [[ "$cur" == -* ]]; then
  7831.         COMPREPLY=( $( compgen -W '--aligned -d --debug \
  7832.             -h --help --ignorelockingfailure --noheadings \
  7833.             --nosuffix -o --options -O --sort -P --partial \
  7834.             --segments --separator --unbuffered --units \
  7835.             -v --verbose --version' -- $cur ) )
  7836.     else
  7837.         _logicalvolumes
  7838.     fi
  7839. }
  7840. complete -F _lvs lvs
  7841.  
  7842. _lvdisplay()
  7843. {
  7844.     local cur prev
  7845.  
  7846.     COMPREPLY=()
  7847.     cur=`_get_cword`
  7848.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7849.  
  7850.     case "$prev" in
  7851.         --units)
  7852.             _units
  7853.             return 0
  7854.             ;;
  7855.     esac
  7856.  
  7857.     if [[ "$cur" == -* ]]; then
  7858.         COMPREPLY=( $( compgen -W '-c --colon -C --columns --units \
  7859.             -P --partial -m --maps -v --verbose -d --debug -h \
  7860.             --help --version' -- $cur ) )
  7861.     else
  7862.         _logicalvolumes
  7863.     fi
  7864. }
  7865. complete -F _lvdisplay lvdisplay
  7866.  
  7867. _lvchange()
  7868. {
  7869.     local cur prev
  7870.  
  7871.     COMPREPLY=()
  7872.     cur=`_get_cword`
  7873.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7874.  
  7875.     case "$prev" in
  7876.         -@(a|A|C|M|-available|-autobackup|-continguous|-persistent))
  7877.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7878.             return 0
  7879.             ;;
  7880.         -@(p|-permission))
  7881.             COMPREPLY=( $( compgen -W 'r rw' -- $cur ) )
  7882.             return 0
  7883.             ;;
  7884.     esac
  7885.  
  7886.     if [[ "$cur" == -* ]]; then
  7887.         COMPREPLY=( $( compgen -W '-A --autobackup -a --available \
  7888.             --addtag --alloc -C --contiguous -d --debug --deltag \
  7889.             -f --force -h --help --ignorelockingfailure -M \
  7890.             --persistent --major major --minor minor -P --partial \
  7891.             -p --permission -r --readahead --refresh -t --test \
  7892.             -v --verbose --version' -- $cur ) )
  7893.     else
  7894.         _logicalvolumes
  7895.     fi
  7896. }
  7897. complete -F _lvchange lvchange
  7898.  
  7899. _lvcreate()
  7900. {
  7901.     local cur prev
  7902.  
  7903.     COMPREPLY=()
  7904.     cur=`_get_cword`
  7905.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7906.  
  7907.     case "$prev" in
  7908.         -@(A|C|M|Z|-autobackup|-continguous|-persistent|-zero))
  7909.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7910.             return 0
  7911.             ;;
  7912.         -@(L|-size))
  7913.             _sizes
  7914.             return 0
  7915.             ;;
  7916.         -@(p|-permission))
  7917.             COMPREPLY=( $( compgen -W 'r rw' -- $cur ) )
  7918.             return 0
  7919.             ;;
  7920.         -@(n|-name))
  7921.             _logicalvolumes
  7922.             return 0
  7923.             ;;
  7924.     esac
  7925.  
  7926.     if [[ "$cur" == -* ]]; then
  7927.         COMPREPLY=( $( compgen -W '-A --autobackup --addtag --alloc \
  7928.             -C --contiguous -d --debug -h -? --help -i --stripes \
  7929.             -I --stripesize -l --extents -L --size -M --persistent \
  7930.             --major --minor -n --name -p --permission -r \
  7931.             --readahead -t --test --type -v --verbose -Z --zero \
  7932.             --version' -- $cur ) )
  7933.     else
  7934.         _args
  7935.         if [ $args -eq 0 ]; then
  7936.             _volumegroups
  7937.         else
  7938.             _physicalvolumes
  7939.         fi
  7940.     fi
  7941. }
  7942. complete -F _lvcreate lvcreate
  7943.  
  7944. _lvremove()
  7945. {
  7946.     local cur prev
  7947.  
  7948.     COMPREPLY=()
  7949.     cur=`_get_cword`
  7950.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7951.  
  7952.     case "$prev" in
  7953.         -@(A|-autobackup))
  7954.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7955.             return 0
  7956.             ;;
  7957.     esac
  7958.  
  7959.     if [[ "$cur" == -* ]]; then
  7960.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -f \
  7961.             --force -h -?  --help -t --test -v --verbose \
  7962.             --version' -- $cur ) )
  7963.     else
  7964.         _logicalvolumes
  7965.     fi
  7966. }
  7967. complete -F _lvremove lvremove
  7968.  
  7969. _lvrename()
  7970. {
  7971.     local cur prev
  7972.  
  7973.     COMPREPLY=()
  7974.     cur=`_get_cword`
  7975.     prev=${COMP_WORDS[COMP_CWORD-1]}
  7976.  
  7977.     case "$prev" in
  7978.         -@(A|-autobackup))
  7979.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  7980.             return 0
  7981.             ;;
  7982.     esac
  7983.  
  7984.     if [[ "$cur" == -* ]]; then
  7985.         COMPREPLY=( $( compgen -W '-A --autobackup -d --debug -h \
  7986.             -? --help -t --test -v --verbose --version' -- $cur ) )
  7987.     else
  7988.         _logicalvolumes
  7989.     fi
  7990. }
  7991. complete -F _lvrename lvrename
  7992.  
  7993. _lvreduce()
  7994. {
  7995.     local cur prev
  7996.  
  7997.     COMPREPLY=()
  7998.     cur=`_get_cword`
  7999.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8000.  
  8001.     case "$prev" in
  8002.         -@(A|-autobackup))
  8003.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  8004.             return 0
  8005.             ;;
  8006.         -@(L|-size))
  8007.             _sizes
  8008.             return 0
  8009.             ;;
  8010.     esac
  8011.  
  8012.     if [[ "$cur" == -* ]]; then
  8013.         COMPREPLY=( $( compgen -W '-A --autobackup -d \
  8014.             --debug -f --force -h --help -l --extents \
  8015.             -L --size -n --nofsck -r --resizefs -t --test \
  8016.             -v --verbose --version' -- $cur ) )
  8017.     else
  8018.         _logicalvolumes
  8019.     fi
  8020. }
  8021. complete -F _lvreduce lvreduce
  8022.  
  8023. _lvresize()
  8024. {
  8025.     local cur prev
  8026.  
  8027.     COMPREPLY=()
  8028.     cur=`_get_cword`
  8029.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8030.  
  8031.     case "$prev" in
  8032.         -@(A|-autobackup))
  8033.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  8034.             return 0
  8035.             ;;
  8036.         -@(L|-size))
  8037.             _sizes
  8038.             return 0
  8039.             ;;
  8040.     esac
  8041.  
  8042.     if [[ "$cur" == -* ]]; then
  8043.         COMPREPLY=( $( compgen -W '-A --autobackup --alloc -d \
  8044.             --debug -h --help -i --stripes -I --stripesize \
  8045.             -l --extents -L --size -n --nofsck -r --resizefs \
  8046.             -t --test --type -v --verbose --version' -- $cur ) )
  8047.     else
  8048.         _args
  8049.         if [ $args -eq 0 ]; then
  8050.             _logicalvolumes
  8051.         else
  8052.             _physicalvolumes
  8053.         fi
  8054.     fi
  8055. }
  8056. complete -F _lvresize lvresize
  8057.  
  8058. _lvextend()
  8059. {
  8060.     local cur prev
  8061.  
  8062.     COMPREPLY=()
  8063.     cur=`_get_cword`
  8064.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8065.  
  8066.     case "$prev" in
  8067.         -@(A|-autobackup))
  8068.             COMPREPLY=( $( compgen -W 'y n' -- $cur ) )
  8069.             return 0
  8070.             ;;
  8071.         -@(L|-size))
  8072.             _sizes
  8073.             return 0
  8074.             ;;
  8075.     esac
  8076.  
  8077.     if [[ "$cur" == -* ]]; then
  8078.         COMPREPLY=( $( compgen -W '-A --autobackup --alloc -d \
  8079.             --debug -h --help -i --stripes -I --stripesize \
  8080.             -l --extents -L --size -n --nofsck -r --resizefs \
  8081.             -t --test --type -v --verbose --version' -- $cur ) )
  8082.     else
  8083.         _args
  8084.         if [ $args -eq 0 ]; then
  8085.             _logicalvolumes
  8086.         else
  8087.             _physicalvolumes
  8088.         fi
  8089.     fi
  8090. }
  8091. complete -F _lvextend lvextend
  8092.  
  8093. _lvm()
  8094. {
  8095.     local prev
  8096.  
  8097.     COMPREPLY=()
  8098.     cur=`_get_cword`
  8099.  
  8100.     if [ $COMP_CWORD -eq 1 ]; then
  8101.         COMPREPLY=( $( compgen -W 'dumpconfig help lvchange \
  8102.             lvcreate lvdisplay lvextend lvmchange \
  8103.             lvmdiskscan lvmsadc lvmsar lvreduce \
  8104.             lvremove lvrename lvresize lvs lvscan \
  8105.             pvchange pvcreate pvdata pvdisplay pvmove \
  8106.             pvremove pvresize pvs pvscan vgcfgbackup \
  8107.             vgcfgrestore vgchange vgck vgconvert \
  8108.             vgcreate vgdisplay vgexport vgextend \
  8109.             vgimport vgmerge vgmknodes vgreduce \
  8110.             vgremove vgrename vgs vgscan vgsplit \
  8111.             version' -- $cur ) )
  8112.     else
  8113.         case ${COMP_WORDS[1]} in
  8114.             pvchange)
  8115.                 _pvchange
  8116.                 ;;
  8117.             pvcreate)
  8118.                 _pvcreate
  8119.                 ;;
  8120.             pvdisplay)
  8121.                 _pvdisplay
  8122.                 ;;
  8123.             pvmove)
  8124.                 _pvmove
  8125.                 ;;
  8126.             pvremove)
  8127.                 _pvremove
  8128.                 ;;
  8129.             pvresize)
  8130.                 _pvresize
  8131.                 ;;
  8132.             pvs)
  8133.                 _pvs
  8134.                 ;;
  8135.             pvscan)
  8136.                 _pvscan
  8137.                 ;;
  8138.             vgcfgbackup)
  8139.                 _vgcfgbackup
  8140.                 ;;
  8141.             vgcfgrestore)
  8142.                 _vgcfgrestore
  8143.                 ;;
  8144.             vgchange)
  8145.                 _vgchange
  8146.                 ;;
  8147.             vgck)
  8148.                 _vgck
  8149.                 ;;
  8150.             vgconvert)
  8151.                 _vgconvert
  8152.                 ;;
  8153.             vgcreate)
  8154.                 _vgcreate
  8155.                 ;;
  8156.             vgdisplay)
  8157.                 _vgdisplay
  8158.                 ;;
  8159.             vgexport)
  8160.                 _vgexport
  8161.                 ;;
  8162.             vgextend)
  8163.                 _vgextend
  8164.                 ;;
  8165.             vgimport)
  8166.                 _vgimport
  8167.                 ;;
  8168.             vgmerge)
  8169.                 _vgmerge
  8170.                 ;;
  8171.             vgmknodes)
  8172.                 _vgmknodes
  8173.                 ;;
  8174.             vgreduce)
  8175.                 _vgreduce
  8176.                 ;;
  8177.             vgremove)
  8178.                 _vgremove
  8179.                 ;;
  8180.             vgrename)
  8181.                 _vgrename
  8182.                 ;;
  8183.             vgs)
  8184.                 _vgs
  8185.                 ;;
  8186.             vgscan)
  8187.                 _vgscan
  8188.                 ;;
  8189.             vgsplit)
  8190.                 _vgsplit
  8191.                 ;;
  8192.             lvchange)
  8193.                 _lvchange
  8194.                 ;;
  8195.             lvcreate)
  8196.                 _lvcreate
  8197.                 ;;
  8198.             lvdisplay)
  8199.                 _lvdisplay
  8200.                 ;;
  8201.             lvextend)
  8202.                 _lvextend
  8203.                 ;;
  8204.             lvreduce)
  8205.                 _lvreduce
  8206.                 ;;
  8207.             lvremove)
  8208.                 _lvremove
  8209.                 ;;
  8210.             lvrename)
  8211.                 _lvrename
  8212.                 ;;
  8213.             lvresize)
  8214.                 _lvresize
  8215.                 ;;
  8216.             lvs)
  8217.                 _lvs
  8218.                 ;;
  8219.             lvscan)
  8220.                 _lvscan
  8221.                 ;;
  8222.         esac
  8223.     fi
  8224. }
  8225. complete -F _lvm lvm
  8226. }
  8227.  
  8228. # mkinitrd(8) completion
  8229. #
  8230. have mkinitrd &&
  8231. _mkinitrd()
  8232. {
  8233.     local cur args
  8234.  
  8235.     COMPREPLY=()
  8236.     cur=`_get_cword`
  8237.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8238.  
  8239.     # --name value style option
  8240.     case "$prev" in
  8241.         --preload)
  8242.             _modules
  8243.             return 0
  8244.             ;;
  8245.     esac
  8246.  
  8247.     # --name=value style option
  8248.     if [[ "$cur" == *=* ]]; then
  8249.         prev=${cur/=*/}
  8250.         cur=${cur/*=/}
  8251.         case "$prev" in
  8252.             --@(with|builtin))
  8253.                 _modules
  8254.                 return 0
  8255.                 ;;
  8256.             --@(fstab|dsdt))
  8257.                 _filedir
  8258.                 return 0
  8259.                 ;;
  8260.             --tmpdir)
  8261.                 _filedir -d
  8262.                 return 0
  8263.                 ;;
  8264.         esac
  8265.     fi
  8266.  
  8267.  
  8268.     if [[ "$cur" == -* ]]; then
  8269.         COMPREPLY=( $( compgen -W '--version -v -f --preload \
  8270.             --with= --omit-scsi-modules --omit-raid-modules \
  8271.             --images-version --fstab= --nocompress --builtin= \
  8272.             --nopivot --noudev --allow-missing --tmpdir= \
  8273.             --initrdfs= --dsdt= --lvm-version= --froce-usb' \
  8274.             -- $cur ) )
  8275.     else
  8276.         _count_args
  8277.  
  8278.         case $args in
  8279.             1)
  8280.                 _filedir
  8281.                 ;;
  8282.             2)
  8283.                 COMPREPLY=( $( command ls /lib/modules | grep "^$cur" ) )
  8284.                 ;;
  8285.         esac
  8286.     fi
  8287.  
  8288. } &&
  8289. complete -F _mkinitrd mkinitrd
  8290.  
  8291. # pkgconfig(1) completion
  8292. #
  8293. have pkg-config &&
  8294. _pkg_config()
  8295. {
  8296.     local cur
  8297.  
  8298.     COMPREPLY=()
  8299.     cur=`_get_cword`
  8300.  
  8301.     if [[ "$cur" == -* ]]; then
  8302.         # return list of available options
  8303.         COMPREPLY=( $( compgen -W '-version --modversion \
  8304.               --atleast-pkgconfig-version= --libs --libs-only-l \
  8305.               --libs-only-other --libs-only-L --cflags \
  8306.               --cflags-only-I --cflags-only-other --variable= \
  8307.               --define-variable= --exists --uninstalled \
  8308.               --atleast-version= --exact-version= --max-version= \
  8309.               --list-all --debug --print-errors --silence-errors \
  8310.               --errors-to-stdout -? --help --usage' -- $cur))
  8311.     else
  8312.         COMPREPLY=( $( pkg-config --list-all 2>/dev/null | \
  8313.                     awk '{print $1}' | grep "^$cur" ) )
  8314.     fi
  8315. } &&
  8316. complete -F _pkg_config pkg-config
  8317.  
  8318.  
  8319. # cpio(1) completion
  8320. #
  8321. have cpio && {
  8322. _cpio_format()
  8323. {
  8324.     COMPREPLY=( $( compgen -W 'bin odc newc crc tar ustar hpbin hpodc' -- $cur ) )
  8325. }
  8326.  
  8327. _cpio()
  8328. {
  8329.     local cur
  8330.  
  8331.     COMPREPLY=()
  8332.     cur=`_get_cword`
  8333.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8334.  
  8335.     # --name value style option
  8336.     case $prev in
  8337.         -H)
  8338.             _cpio_format
  8339.             return 0
  8340.             ;;
  8341.         -@(E|F|I))
  8342.             _filedir
  8343.             return 0
  8344.             ;;
  8345.         -R)
  8346.             _usergroup
  8347.             return 0
  8348.             ;;
  8349.     esac
  8350.  
  8351.     # --name=value style option
  8352.     if [[ "$cur" == *=* ]]; then
  8353.         prev=${cur/=*/}
  8354.         cur=${cur/*=/}
  8355.         case $prev in
  8356.             --format)
  8357.                 _cpio_format
  8358.                 return 0
  8359.                 ;;
  8360.             --@(file|pattern-file))
  8361.                 _filedir
  8362.                 return 0
  8363.                 ;;
  8364.             --owner)
  8365.                 _usergroup
  8366.                 return 0
  8367.                 ;;
  8368.             --rsh-command)
  8369.                 COMPREPLY=( $( compgen -c -- $cur ) )
  8370.                 return 0
  8371.                 ;;
  8372.         esac
  8373.     fi
  8374.  
  8375.     if [ $COMP_CWORD -eq 1 ]; then
  8376.         COMPREPLY=( $( compgen -W '-o --create -i --extract -p --pass-through' -- $cur) ) 
  8377.     else
  8378.         case ${COMP_WORDS[1]} in
  8379.             -@(o|-create))
  8380.                 if [[ "$cur" == -* ]]; then
  8381.                     COMPREPLY=( $( compgen -W '-0 -a -c -v -A -B\
  8382.                         -L -V -C -H -M -O -F --file= --format=\
  8383.                         --message= --null --reset-access-time\
  8384.                         --verbose --dot --append --block-size=\
  8385.                         --dereference --io-size= --quiet\
  8386.                         --force-local --rsh-command= --help\
  8387.                         --version' -- $cur ) )
  8388.                 fi
  8389.                 ;;
  8390.             -@(i|-extract))
  8391.                 if [[ "$cur" == -* ]]; then
  8392.                     COMPREPLY=( $( compgen -W '-b -c -d -f -m -n -r\
  8393.                         -t -s -u -v -B -S -V -C -E -H -M -R -I\
  8394.                         -F --file= --make-directories\
  8395.                         --nonmatching\
  8396.                         --preserve-modification-time\
  8397.                         --numeric-uid-gid --rename -t --list\
  8398.                         --swap-bytes --swap --dot\
  8399.                         --unconditional --verbose --block-size=\
  8400.                         --swap-halfwords --io-size=\
  8401.                         --pattern-file= --format= --owner=\
  8402.                         --no-preserve-owner --message=\
  8403.                         --force-local --no-absolute-filenames\
  8404.                         --sparse --only-verify-crc --quiet\
  8405.                         --rsh-command= --help\
  8406.                         --version' -- $cur ) )
  8407.                 fi
  8408.                 ;;
  8409.             -@(p|-pass-through))
  8410.                 if [[ "$cur" == -* ]]; then
  8411.                     COMPREPLY=( $( compgen -W '-0 -a -d -l -m -u -v\
  8412.                         -L -V -R --null --reset-access-time\
  8413.                         --make-directories --link --quiet\
  8414.                         --preserve-modification-time\
  8415.                         --unconditional --verbose --dot\
  8416.                         --dereference --owner=\
  8417.                         --no-preserve-owner --sparse --help\
  8418.                         --version' -- $cur ) )
  8419.                 else
  8420.                     _filedir -d
  8421.                 fi
  8422.                 ;;
  8423.         esac
  8424.     fi
  8425. }
  8426. complete -F _cpio cpio
  8427. }
  8428.  
  8429. # id(1) completion
  8430. #
  8431. have id &&
  8432. _id()
  8433. {
  8434.     local cur
  8435.  
  8436.     COMPREPLY=()
  8437.     cur=`_get_cword`
  8438.  
  8439.     if [[ "$cur" == -* ]]; then
  8440.         COMPREPLY=( $( compgen -W '-a -g --group -G --groups -n --name\
  8441.             -r --real -u --user --help --version' -- $cur ) )
  8442.     else
  8443.         COMPREPLY=( $( compgen -u $cur  ) )
  8444.     fi
  8445. } &&
  8446. complete -F _id id
  8447.  
  8448. # getent(1) completion
  8449. #
  8450. have getent &&
  8451. _getent()
  8452. {
  8453.     local cur prev
  8454.  
  8455.     COMPREPLY=()
  8456.     cur=`_get_cword`
  8457.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8458.  
  8459.     case $prev in
  8460.         passwd)
  8461.             COMPREPLY=( $( compgen -u $cur  ) )
  8462.             return 0
  8463.             ;;
  8464.         group)
  8465.             COMPREPLY=( $( compgen -g $cur  ) )
  8466.             return 0
  8467.             ;;
  8468.         services)
  8469.             COMPREPLY=( $( compgen -s $cur  ) )
  8470.             return 0
  8471.             ;;
  8472.         hosts)
  8473.             COMPREPLY=( $( compgen -A hostname $cur  ) )
  8474.             return 0
  8475.             ;;
  8476.         protocols)
  8477.             COMPREPLY=( $( getent protocols | awk '{print $1}' | grep "^$cur" ) )
  8478.             return 0
  8479.             ;;
  8480.         networks)
  8481.             COMPREPLY=( $( getent networks | awk '{print $1}' | grep "^$cur" ) )
  8482.             return 0
  8483.             ;;
  8484.     esac
  8485.  
  8486.  
  8487.     if [ $COMP_CWORD -eq 1 ]; then
  8488.         COMPREPLY=( $( compgen -W 'passwd group hosts services protocols networks' -- $cur ) )
  8489.     fi
  8490. } &&
  8491. complete -F _getent getent
  8492.  
  8493. # ntpdate(1) completion
  8494. #
  8495. have ntpdate &&
  8496. _ntpdate()
  8497. {
  8498.     local cur prev
  8499.  
  8500.     COMPREPLY=()
  8501.     cur=`_get_cword`
  8502.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8503.  
  8504.     case $prev in
  8505.         -k)
  8506.             _filedir
  8507.             return 0
  8508.             ;;
  8509.         -U)
  8510.             COMPREPLY=( $( compgen -u $cur  ) )
  8511.             return 0
  8512.             ;;
  8513.     esac
  8514.  
  8515.     if [[ "$cur" == -* ]]; then
  8516.         COMPREPLY=( $( compgen -W '-4 -6 -b -B -d -Q -q -s -u -v -a\
  8517.             -e -k -p -o -r -t' -- $cur ) )
  8518.     else
  8519.         _known_hosts
  8520.     fi
  8521. } &&
  8522. complete -F _ntpdate ntpdate
  8523.  
  8524. # smartctl(8) completion
  8525. #
  8526. have smartctl && {
  8527. _smartctl_quietmode()
  8528. {
  8529.     COMPREPLY=( $( compgen -W 'errorsonly silent' -- $cur ) )
  8530. }
  8531. _smartctl_device()
  8532. {
  8533.     COMPREPLY=( $( compgen -W 'ata scsi 3ware' -- $cur ) )
  8534. }
  8535. _smartctl_tolerance()
  8536. {
  8537.     COMPREPLY=( $( compgen -W 'warn exit ignore' -- $cur ) )
  8538. }
  8539. _smartctl_badsum()
  8540. {
  8541.     COMPREPLY=( $( compgen -W 'normal conservative permissive verypermissive' -- $cur ) )
  8542. }
  8543. _smartctl_report()
  8544. {
  8545.     COMPREPLY=( $( compgen -W 'ioctl ataioctl scsiioctl' -- $cur ) )
  8546. }
  8547. _smartctl_feature()
  8548. {
  8549.     COMPREPLY=( $( compgen -W 'on off' -- $cur ) )
  8550. }
  8551. _smartctl_log()
  8552. {
  8553.     COMPREPLY=( $( compgen -W 'error selftest selective directory' -- $cur ) )
  8554. }
  8555. _smartctl_vendorattribute()
  8556. {
  8557.     COMPREPLY=( $( compgen -W 'help 9,minutes 9,seconds 9,halfminutes \
  8558.         9,temp 192,emergencyretractcyclect 193,loadunload \
  8559.         194,10xCelsius 194,unknown 198,offlinescanuncsectorct \
  8560.         200,writeerrorcount 201,detectedtacount 220,temp' -- $cur ) )
  8561. }
  8562. _smartctl_firmwarebug()
  8563. {
  8564.     COMPREPLY=( $( compgen -W 'none samsung samsung2' -- $cur ) )
  8565. }
  8566. _smartctl_presets()
  8567. {
  8568.     COMPREPLY=( $( compgen -W 'use ignore show showall' -- $cur ) )
  8569. }
  8570. _smartctl_test()
  8571. {
  8572.     COMPREPLY=( $( compgen -W 'offline short long conveyance select afterselect,on afterselect,off pending' -- $cur ) )
  8573. }
  8574.  
  8575. _smartctl()
  8576. {
  8577.     local cur prev
  8578.  
  8579.     COMPREPLY=()
  8580.     cur=`_get_cword`
  8581.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8582.  
  8583.     # --name value style option
  8584.     case "$prev" in
  8585.         -q)
  8586.             _smartctl_quietmode
  8587.             ;;
  8588.         -d)
  8589.             _smartctl_device
  8590.             return 0
  8591.             ;;
  8592.         -t)
  8593.             _smartctl_tolerance
  8594.             return 0
  8595.             ;;
  8596.         -b)
  8597.             _smartctl_badsum
  8598.             return 0
  8599.             ;;
  8600.         -r)
  8601.             _smartctl_report
  8602.             return 0
  8603.             ;;
  8604.         -s)
  8605.             _smartctl_feature
  8606.             return 0
  8607.             ;;
  8608.         -o)
  8609.             _smartctl_feature
  8610.             return 0
  8611.             ;;
  8612.         -S)
  8613.             _smartctl_feature
  8614.             return 0
  8615.             ;;
  8616.         -l)
  8617.             _smartctl_log
  8618.             return 0
  8619.             ;;
  8620.         -v)
  8621.             _smartctl_vendorattribute
  8622.             return 0
  8623.             ;;
  8624.         -F)
  8625.             _smartctl_firmwarebug
  8626.             return 0
  8627.             ;;
  8628.         -P)
  8629.             _smartctl_presets
  8630.             return 0
  8631.             ;;
  8632.         -t)
  8633.             _smartctl_test
  8634.             return 0
  8635.             ;;
  8636.     esac
  8637.  
  8638.     # --name=value style option
  8639.     if [[ "$cur" == *=* ]]; then
  8640.         prev=${cur/=*/}
  8641.         cur=${cur/*=/}
  8642.         case "$prev" in
  8643.             --quietmode)
  8644.                 _smartctl_quietmode
  8645.                 return 0
  8646.                 ;;
  8647.             --device)
  8648.                 _smartctl_device
  8649.                 return 0
  8650.                 ;;
  8651.             --tolerance)
  8652.                 _smartctl_tolerance
  8653.                 return 0
  8654.                 ;;
  8655.             --badsum)
  8656.                 _smartctl_badsum
  8657.                 return 0
  8658.                 ;;
  8659.             --report)
  8660.                 _smartctl_report
  8661.                 return 0
  8662.                 ;;
  8663.             --smart)
  8664.                 _smartctl_feature
  8665.                 return 0
  8666.                 ;;
  8667.             --offlineauto)
  8668.                 _smartctl_feature
  8669.                 return 0
  8670.                 ;;
  8671.             --saveauto)
  8672.                 _smartctl_feature
  8673.                 return 0
  8674.                 ;;
  8675.             --log)
  8676.                 _smartctl_log
  8677.                 return 0
  8678.                 ;;
  8679.             --vendorattribute)
  8680.                 _smartctl_vendorattribute
  8681.                 return 0
  8682.                 ;;
  8683.             --firmwarebug)
  8684.                 _smartctl_firmwarebug
  8685.                 return 0
  8686.                 ;;
  8687.             --presets)
  8688.                 _smartctl_presets
  8689.                 return 0
  8690.                 ;;
  8691.             --test)
  8692.                 _smartctl_test
  8693.                 return 0
  8694.                 ;;
  8695.         esac
  8696.     fi
  8697.  
  8698.  
  8699.     if [[ "$cur" == -* ]]; then
  8700.         COMPREPLY=( $( compgen -W '-h --help --usage -V --version \
  8701.             --copyright --license-i --info -a --all -q \
  8702.             --quietmode= -d --device= -T --tolerance= -b --badsum= \
  8703.             -r --report= -s --smart= -o --offlineauto= -S \
  8704.             --saveauto= -H --health -c --capabilities -A \
  8705.             --attributes -l --log= -v --vendorattribute= -F \
  8706.             --firmwarebug= -P --presets= -t --test= -C \
  8707.             --captive -X --abort' -- $cur ) )
  8708.     else
  8709.         cur=${cur:=/dev/}
  8710.         _filedir
  8711.     fi
  8712. }
  8713. complete -F _smartctl smartctl
  8714. }
  8715.  
  8716. # vncviewer(1) completion
  8717. #
  8718. have vncviewer &&
  8719. _vncviewer()
  8720. {
  8721.     local cur prev
  8722.     local -a config
  8723.     
  8724.     COMPREPLY=()
  8725.     cur=`_get_cword`
  8726.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8727.  
  8728.     case "$prev" in
  8729.     -via)
  8730.        _known_hosts -a
  8731.        ;;
  8732.     *)
  8733.        # ssh into the the server, find and ping the broadcast address, then
  8734.        # sort and show the results.
  8735.        COMPREPLY=( $( ssh -o 'Batchmode yes' $prev \
  8736.               "ping -bnc 4 255.255.255.255" 2>/dev/null | \
  8737.               awk -F ' ' '{print $4}' | \
  8738.               sort -n | uniq | egrep '[0-9]+\.[0-9]+\.' 2>/dev/null ) )
  8739.     esac
  8740.                                    
  8741.     return 0
  8742. } &&
  8743. complete -F _vncviewer vncviewer
  8744.  
  8745. # sysctl(8) completion
  8746. #
  8747. have sysctl &&
  8748. _sysctl()
  8749. {
  8750.     local cur
  8751.  
  8752.     COMPREPLY=()
  8753.     cur=`_get_cword`
  8754.  
  8755.     COMPREPLY=( $( compgen -W "$(sysctl -N -a 2>/dev/null)" -- $cur ) )
  8756.  
  8757.     return 0
  8758. } &&
  8759. complete -F _sysctl sysctl
  8760.  
  8761. # update-rc.d(8) completion
  8762. #
  8763. # Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com>
  8764. #
  8765. have update-rc.d &&
  8766. _update_rc_d()
  8767. {
  8768.     local cur prev sysvdir services options valid_options
  8769.  
  8770.     cur=`_get_cword`
  8771.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8772.  
  8773.     [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \
  8774.     || sysvdir=/etc/init.d
  8775.  
  8776.     services=( $(echo $sysvdir/!(README*|*.sh|*.dpkg*|*.rpm*)) )
  8777.     services=( ${services[@]#$sysvdir/} )
  8778.     options=( -f -n )
  8779.  
  8780.     if [[ $COMP_CWORD -eq 1 || "$prev" == -* ]]; then
  8781.     valid_options=( $( \
  8782.         echo "${COMP_WORDS[@]} ${options[@]}" \
  8783.         | tr " " "\n" \
  8784.         | sed -ne "/$( echo "${options[@]}" | sed "s/ /\\|/g" )/p" \
  8785.         | sort | uniq -u \
  8786.         ) )
  8787.     COMPREPLY=( $( compgen -W '${options[@]} ${services[@]}' \
  8788.         -X '$( echo ${COMP_WORDS[@]} | tr " " "|" )' -- $cur ) )
  8789.     elif [[ "$prev" == ?($( echo ${services[@]} | tr " " "|" )) ]]; then
  8790.     COMPREPLY=( $( compgen -W 'remove defaults start stop' -- $cur ) )
  8791.     elif [[ "$prev" == defaults && "$cur" == [0-9] ]]; then
  8792.     COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 )
  8793.     elif [[ "$prev" == defaults && "$cur" == [sk]?([0-9]) ]]; then
  8794.     COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 )
  8795.     elif [[ "$prev" == defaults && -z "$cur" ]]; then
  8796.     COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 s k )
  8797.     elif [[ "$prev" == ?(start|stop) ]]; then
  8798.     if [[ "$cur" == [0-9] || -z "$cur" ]]; then 
  8799.         COMPREPLY=( 0 1 2 3 4 5 6 7 8 9 )
  8800.     elif [[ "$cur" == [0-9][0-9] ]]; then 
  8801.         COMPREPLY=( $cur )
  8802.     else
  8803.         COMPREPLY=()
  8804.     fi
  8805.     elif [[ "$prev" == ?([0-9][0-9]|[0-6S]) ]]; then
  8806.     if [[ -z "$cur" ]]; then
  8807.         if [[ $prev == [0-9][0-9] ]]; then
  8808.         COMPREPLY=( 0 1 2 3 4 5 6 S )
  8809.         else
  8810.         COMPREPLY=( 0 1 2 3 4 5 6 S . )
  8811.         fi
  8812.     elif [[ "$cur" == [0-6S.] ]]; then 
  8813.         COMPREPLY=( $cur )
  8814.     else
  8815.         COMPREPLY=()
  8816.     fi
  8817.     elif [[ "$prev" == "." ]]; then
  8818.     COMPREPLY=( $(compgen -W "start stop" -- $cur) )
  8819.     else
  8820.     COMPREPLY=()
  8821.     fi
  8822.  
  8823.     return 0
  8824. } &&
  8825. complete -F _update_rc_d update-rc.d
  8826.  
  8827. # invoke-rc.d(8) completion
  8828. #
  8829. # Copyright (C) 2004 Servilio Afre Puentes <servilio@gmail.com>
  8830. #
  8831. have invoke-rc.d &&
  8832. _invoke_rc_d()
  8833. {
  8834.     local cur prev sysvdir services options valid_options
  8835.  
  8836.     cur=`_get_cword`
  8837.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8838.  
  8839.     [ -d /etc/rc.d/init.d ] && sysvdir=/etc/rc.d/init.d \
  8840.     || sysvdir=/etc/init.d
  8841.  
  8842.     services=( $(echo $sysvdir/!(README*|*.sh|*.dpkg*|*.rpm*)) )
  8843.     services=( ${services[@]#$sysvdir/} )
  8844.     options=( --help --quiet --force --try-anyway --disclose-deny --query --no-fallback )
  8845.  
  8846.     if [[ ($COMP_CWORD -eq 1) || ("$prev" == --* ) ]]; then
  8847.     valid_options=( $( \
  8848.         echo ${COMP_WORDS[@]} ${options[@]} \
  8849.         | tr " " "\n" \
  8850.         | sed -ne "/$( echo ${options[@]} | sed "s/ /\\\\|/g" )/p" \
  8851.         | sort | uniq -u \
  8852.         ) )
  8853.     COMPREPLY=( $( compgen -W '${valid_options[@]} ${services[@]}' -- \
  8854.         $cur ) )
  8855.     elif [ -x $sysvdir/$prev ]; then
  8856.     COMPREPLY=( $( compgen -W '`sed -ne "y/|/ /; \
  8857.                         s/^.*Usage:[ ]*[^ ]*[ ]*{*\([^}\"]*\).*$/\1/p" \
  8858.                         $sysvdir/$prev`' -- \
  8859.         $cur ) )
  8860.     else
  8861.     COMPREPLY=()
  8862.     fi
  8863.  
  8864.     return 0
  8865. } &&
  8866. complete -F _invoke_rc_d invoke-rc.d
  8867.  
  8868. # minicom(1) completion
  8869. #
  8870. have minicom &&
  8871. _minicom()
  8872. {
  8873.     local cur prev
  8874.  
  8875.     COMPREPLY=()
  8876.     cur=`_get_cword`
  8877.     prev=${COMP_WORDS[COMP_CWORD-1]}
  8878.  
  8879.     case $prev in
  8880.         -@(a|c))
  8881.             COMPREPLY=( $( compgen -W 'on off' -- $cur ) )
  8882.             return 0
  8883.             ;;
  8884.         -@(S|C))
  8885.             _filedir
  8886.             return 0
  8887.             ;;
  8888.         -P)
  8889.             COMPREPLY=( $( command ls /dev/tty* ) )
  8890.             COMPREPLY=( $( compgen -W '${COMPREPLY[@]} ${COMPREPLY[@]#/dev/}' -- $cur ) )
  8891.             return 0
  8892.             ;;
  8893.     esac
  8894.  
  8895.  
  8896.     if [[ "$cur" == -* ]]; then
  8897.         COMPREPLY=( $( compgen -W '-s -o -m -M -z -l -L -w -a -t \
  8898.             -c -S -d -p -C -T -8' -- $cur ) )
  8899.     else
  8900.         COMPREPLY=( $( command ls /etc/minicom/minirc.* 2>/dev/null | sed -e 's|/etc/minicom/minirc.||' | grep "^$cur" ) )
  8901.     fi
  8902. } &&
  8903. complete -F _minicom minicom
  8904.  
  8905. # svn completion
  8906. #
  8907. have svn &&
  8908. {
  8909. _svn()
  8910. {
  8911.     local cur prev commands options command
  8912.  
  8913.     COMPREPLY=()
  8914.     cur=`_get_cword`
  8915.  
  8916.     commands='add blame praise annotate ann cat checkout co cleanup commit \
  8917.         ci copy cp delete del remove rm diff di export help ? h import \
  8918.         info list ls lock log merge mkdir move mv rename ren \
  8919.         propdel pdel pd propedit pedit pe propget pget pg \
  8920.         proplist plist pl propset pset ps resolved revert \
  8921.         status stat st switch sw unlock update up'
  8922.  
  8923.     if [[ $COMP_CWORD -eq 1 ]] ; then
  8924.         if [[ "$cur" == -* ]]; then
  8925.             COMPREPLY=( $( compgen -W '--version' -- $cur ) )
  8926.         else
  8927.             COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  8928.         fi
  8929.     else
  8930.  
  8931.         prev=${COMP_WORDS[COMP_CWORD-1]}
  8932.         case $prev in
  8933.             --config-dir)
  8934.                 _filedir -d
  8935.                 return 0;
  8936.                 ;;
  8937.             -@(F|-file|-targets))
  8938.                 _filedir
  8939.                 return 0;
  8940.                 ;;
  8941.             --encoding)
  8942.                 COMPREPLY=( $( compgen -W \
  8943.                     '$( iconv --list | sed -e "s@//@@;" )' \
  8944.                     -- "$cur" ) )
  8945.                 return 0;
  8946.                 ;;
  8947.             --@(editor|diff|diff3)-cmd)
  8948.                 COMP_WORDS=(COMP_WORDS[0] $cur)
  8949.                 COMP_CWORD=1
  8950.                 _command
  8951.                 return 0;
  8952.                 ;;
  8953.         esac
  8954.  
  8955.         command=${COMP_WORDS[1]}
  8956.  
  8957.         if [[ "$cur" == -* ]]; then
  8958.             # possible options for the command
  8959.             case $command in
  8960.                 add)
  8961.                     options='--auto-props --no-auto-props \
  8962.                         --force --targets --no-ignore \
  8963.                         --non-recursive -N -q --quiet'
  8964.                     ;;
  8965.                 @(blame|annotate|ann|praise))
  8966.                     options='-r --revisions --username \
  8967.                         --password --no-auth-cache \
  8968.                         --non-interactive -v \
  8969.                         --verbose --incremental --xml'
  8970.                     ;;
  8971.                 cat)
  8972.                     options='-r --revision --username \
  8973.                         --password --no-auth-cache \
  8974.                         --non-interactive'
  8975.                     ;;
  8976.                 @(checkout|co))
  8977.                     options='-r --revision -q --quiet -N \
  8978.                         --non-recursive --username \
  8979.                         --password --no-auth-cache \
  8980.                         --non-interactive \
  8981.                         --ignore-externals'
  8982.                     ;;
  8983.                 cleanup)
  8984.                     options='--diff3-cmd'
  8985.                     ;;
  8986.                 @(commit|ci))
  8987.                     options='-m --message -F --file \
  8988.                         --encoding --force-log -q \
  8989.                         --quiet --non-recursive -N \
  8990.                         --targets --editor-cmd \
  8991.                         --username --password \
  8992.                         --no-auth-cache \
  8993.                         --non-interactive --no-unlock'
  8994.                     ;;
  8995.                 @(copy|cp))
  8996.                     options='-m --message -F --file \
  8997.                         --encoding --force-log -r \
  8998.                         --revision -q --quiet \
  8999.                         --editor-cmd -username \
  9000.                         --password --no-auth-cache \
  9001.                         --non-interactive'
  9002.                     ;;
  9003.                 @(delete|del|remove|rm))
  9004.                     options='--force -m --message -F \
  9005.                         --file --encoding --force-log \
  9006.                         -q --quiet --targets \
  9007.                         --editor-cmd -username \
  9008.                         --password --no-auth-cache \
  9009.                         --non-interactive'
  9010.                     ;;
  9011.                 @(diff|di))
  9012.                     options='-r --revision -x --extensions \
  9013.                         --diff-cmd --no-diff-deleted \
  9014.                         -N --non-recursive --username \
  9015.                         --password --no-auth-cache \
  9016.                         --non-interactive --force \
  9017.                         --old --new --notice-ancestry'
  9018.                     ;;
  9019.                 export)
  9020.                     options='-r --revision -q --quiet \
  9021.                         --username --password \
  9022.                         --no-auth-cache \
  9023.                         --non-interactive -N \
  9024.                         --non-recursive --force \
  9025.                         --native-eol --ignore-externals'
  9026.                     ;;
  9027.                 import)
  9028.                     options='--auto-props --no-auto-props \
  9029.                         -m --message -F --file \
  9030.                         --encoding --force-log -q \
  9031.                         --quiet --non-recursive \
  9032.                         --no-ignore --editor-cmd \
  9033.                         --username --password \
  9034.                         --no-auth-cache \
  9035.                         --non-interactive'
  9036.                     ;; 
  9037.                 info)
  9038.                     options='--username --password \
  9039.                         --no-auth-cache \
  9040.                         --non-interactive -r \
  9041.                         --revision --xml --targets \
  9042.                         -R --recursive --incremental'
  9043.                     ;;
  9044.                 @(list|ls))
  9045.                     options='-r --revision -v --verbose -R \
  9046.                         --recursive --username \
  9047.                         --password --no-auth-cache \
  9048.                         --non-interactive \
  9049.                         --incremental --xml'
  9050.                     ;;
  9051.                 lock)
  9052.                     options='-m --message -F --file \
  9053.                         --encoding --force-log \
  9054.                         --targets --force --username \
  9055.                         --password --no-auth-cache \
  9056.                         --non-interactive'
  9057.                     ;;
  9058.                 log)
  9059.                     options='-r --revision -v --verbose \
  9060.                         --targets --username \
  9061.                         --password --no-auth-cache \
  9062.                         --non-interactive \
  9063.                         --stop-on-copy --incremental \
  9064.                         --xml -q --quiet --limit'
  9065.                     ;;
  9066.                 merge)
  9067.                     options='-r --revision -N \
  9068.                         --non-recursive -q --quiet \
  9069.                         --force --dry-run --diff3-cmd \
  9070.                         --username --password \
  9071.                         --no-auth-cache \
  9072.                         --non-interactive \
  9073.                         --ignore-ancestry'
  9074.                     ;;
  9075.                 mkdir)
  9076.                     options='-m --message -F --file \
  9077.                         --encoding --force-log -q \
  9078.                         --quiet --editor-cmd \
  9079.                         --username --password \
  9080.                         --no-auth-cache \
  9081.                         --non-interactive'
  9082.                     ;;
  9083.                 @(move|mv|rename|ren))
  9084.                     options='-m --message -F --file \
  9085.                         --encoding --force-log -r \
  9086.                         --revision -q --quiet \
  9087.                         --force --editor-cmd \
  9088.                         --username --password \
  9089.                         --no-auth-cache \
  9090.                         --non-interactive'
  9091.                     ;;
  9092.                 @(propdel|pdel|pd))
  9093.                     options='-q --quiet -R --recursive -r \
  9094.                         --revision --revprop \
  9095.                         --username --password \
  9096.                         --no-auth-cache \
  9097.                         --non-interactive'
  9098.                     ;;
  9099.                 @(propedit|pedit|pe))
  9100.                     options='-r --revision --revprop \
  9101.                         --encoding --editor-cmd \
  9102.                         --username --password \
  9103.                         --no-auth-cache \
  9104.                         --non-interactive --force'
  9105.                     ;;
  9106.                 @(propget|pget|pg))
  9107.                     options='-R --recursive -r --revision \
  9108.                         --revprop --strict --username \
  9109.                         --password --no-auth-cache \
  9110.                         --non-interactive'
  9111.                     ;;
  9112.                 @(proplist|plist|pl))
  9113.                     options='-v --verbose -R --recursive \
  9114.                         -r --revision --revprop -q \
  9115.                         --quiet --username --password \
  9116.                         --no-auth-cache \
  9117.                         --non-interactive'
  9118.                     ;;
  9119.                 @(propset|pset|ps))
  9120.                     options='-F --file -q --quiet \
  9121.                         --targets -R --recursive \
  9122.                         --revprop --encoding \
  9123.                         --username --password \
  9124.                         --no-auth-cache \
  9125.                         --non-interactive -r \
  9126.                         --revision --force'
  9127.                     ;;
  9128.                 resolved)
  9129.                     options='--targets -R --recursive -q \
  9130.                         --quiet'
  9131.                     ;;
  9132.                 revert)
  9133.                     options='--targets -R --recursive -q \
  9134.                         --quiet'
  9135.                     ;;
  9136.                 @(status|stat|st))
  9137.                     options='-u --show-updates -v \
  9138.                         --verbose -N --non-recursive \
  9139.                         -q --quiet --username \
  9140.                         --password --no-auth-cache \
  9141.                         --non-interactive --no-ignore \
  9142.                         --ignore-externals \
  9143.                         --incremental --xml'
  9144.                     ;;
  9145.                 @(switch|sw))
  9146.                     options='--relocate -r --revision -N \
  9147.                         --non-recursive -q --quiet \
  9148.                         --username --password \
  9149.                         --no-auth-cache \
  9150.                         --non-interactive --diff3-cmd'
  9151.                     ;;
  9152.                 unlock)
  9153.                     options='--targets --force --username \
  9154.                         --password --no-auth-cache \
  9155.                         --non-interactive'
  9156.                     ;;
  9157.                 @(update|up))
  9158.                     options='-r --revision -N \
  9159.                         --non-recursive -q --quiet \
  9160.                         --username --password \
  9161.                         --no-auth-cache \
  9162.                         --non-interactive \
  9163.                         --diff3-cmd --ignore-externals'
  9164.                     ;;
  9165.             esac
  9166.             options="$options --help -h --config-dir"
  9167.  
  9168.             COMPREPLY=( $( compgen -W "$options" -- $cur ) )
  9169.         else
  9170.             if [[ "$command" == @(help|h|\?) ]]; then
  9171.                 COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  9172.             else
  9173.                 _filedir
  9174.             fi
  9175.         fi
  9176.     fi
  9177.  
  9178.     return 0
  9179. }
  9180. complete -F _svn $default svn
  9181.  
  9182. _svnadmin()
  9183. {
  9184.     local cur prev commands options mode
  9185.  
  9186.     COMPREPLY=()
  9187.     cur=`_get_cword`
  9188.  
  9189.     commands='create deltify dump help ? hotcopy list-dblogs \
  9190.         list-unused-dblogs load lslocks lstxns recover rmlocks \
  9191.         rmtxns setlog verify'
  9192.  
  9193.     if [[ $COMP_CWORD -eq 1 ]] ; then
  9194.         if [[ "$cur" == -* ]]; then
  9195.             COMPREPLY=( $( compgen -W '--version' -- $cur ) )
  9196.         else
  9197.             COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  9198.         fi
  9199.     else
  9200.         prev=${COMP_WORDS[COMP_CWORD-1]}
  9201.         case $prev in
  9202.             --config-dir)
  9203.                 _filedir -d
  9204.                 return 0;
  9205.                 ;;
  9206.             --fs-type)
  9207.                 COMPREPLY=( $( compgen -W 'fsfs bdb' -- $cur ) )
  9208.                 return 0;
  9209.                 ;;
  9210.         esac
  9211.  
  9212.         command=${COMP_WORDS[1]}
  9213.  
  9214.         if [[ "$cur" == -* ]]; then
  9215.             # possible options for the command
  9216.             case $command in
  9217.                 create)
  9218.                     options='--bdb-txn-nosync \
  9219.                         --bdb-log-keep --config-dir \
  9220.                         --fs-type'
  9221.                     ;;
  9222.                 deltify)
  9223.                     options='-r --revision -q --quiet'
  9224.                     ;;
  9225.                 dump)
  9226.                     options='-r --revision --incremental \
  9227.                         -q --quiet --deltas'
  9228.                     ;;
  9229.                 hotcopy)
  9230.                     options='--clean-logs'
  9231.                     ;;
  9232.                 load)
  9233.                     options='--ignore-uuid --force-uuid \
  9234.                         --parent-dir -q --quiet \
  9235.                         --use-pre-commit-hook \
  9236.                         --use-post-commit-hook'
  9237.                     ;;
  9238.                 rmtxns)
  9239.                     options='-q --quiet'
  9240.                     ;;
  9241.                 setlog)
  9242.                     options='-r --revision --bypass-hooks'
  9243.                     ;;
  9244.             esac
  9245.  
  9246.             options="$options --help -h"
  9247.             COMPREPLY=( $( compgen -W "$options" -- $cur ) )
  9248.         else
  9249.             if [[ "$command" == @(help|h|\?) ]]; then
  9250.                 COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  9251.             else
  9252.                 _filedir
  9253.             fi
  9254.         fi
  9255.     fi
  9256.  
  9257.     return 0
  9258. }
  9259. complete -F _svnadmin $default svnadmin
  9260.  
  9261. _svnlook()
  9262. {
  9263.     local cur prev commands options mode
  9264.  
  9265.     COMPREPLY=()
  9266.     cur=`_get_cword`
  9267.  
  9268.     commands='author cat changed date diff dirs-changed help ? h history \
  9269.         info lock log propget pget pg proplist plist pl tree uuid \
  9270.         youngest'
  9271.  
  9272.     if [[ $COMP_CWORD -eq 1 ]] ; then
  9273.         if [[ "$cur" == -* ]]; then
  9274.             COMPREPLY=( $( compgen -W '--version' -- $cur ) )
  9275.         else
  9276.             COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  9277.         fi
  9278.     else
  9279.         command=${COMP_WORDS[1]}
  9280.  
  9281.         if [[ "$cur" == -* ]]; then
  9282.             # possible options for the command
  9283.             case $command in
  9284.                 @(author|cat|date|dirs-changed|info|log))
  9285.                     options='-r --revision -t \
  9286.                         --transaction'
  9287.                     ;;
  9288.                 changed)
  9289.                     options='-r --revision -t \
  9290.                         --transaction --copy-info'
  9291.                     ;;
  9292.                 diff)
  9293.                     options='-r --revision -t \
  9294.                         --transaction \
  9295.                         --no-diff-deleted \
  9296.                         --no-diff-added \
  9297.                         --diff-copy-from'
  9298.                     ;;
  9299.                 history)
  9300.                     options='-r --revision --show-ids'
  9301.                     ;;
  9302.                 prop@(get|list))
  9303.                     options='-r --revision -t \
  9304.                         --transaction --revprop'
  9305.                     ;;
  9306.                 tree)
  9307.                     options='-r --revision -t \
  9308.                         --transaction --show-ids \
  9309.                         --full-paths'
  9310.                     ;;
  9311.             esac
  9312.  
  9313.             options="$options --help -h"
  9314.             COMPREPLY=( $( compgen -W "$options" -- $cur ) )
  9315.         else
  9316.             if [[ "$command" == @(help|h|\?) ]]; then
  9317.                 COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
  9318.             else
  9319.                 _filedir
  9320.             fi
  9321.         fi
  9322.     fi
  9323.  
  9324.     return 0
  9325. }
  9326. complete -F _svnlook $default svnlook
  9327. }
  9328.  
  9329. _filedir_xspec()
  9330. {
  9331.     local IFS cur xspec
  9332.  
  9333.     IFS=$'\t\n'
  9334.     COMPREPLY=()
  9335.     cur=`_get_cword`
  9336.  
  9337.     _expand || return 0
  9338.  
  9339.     # get first exclusion compspec that matches this command
  9340.     xspec=$( sed -ne $'/^complete .*[ \t]'${1##*/}$'\([ \t]\|$\)/{p;q;}' \
  9341.           $BASH_COMPLETION )
  9342.     # prune to leave nothing but the -X spec
  9343.     xspec=${xspec#*-X }
  9344.     xspec=${xspec%% *}
  9345.  
  9346.     local toks=( ) tmp
  9347.  
  9348.     while read -r tmp; do
  9349.         [[ -n $tmp ]] && toks[${#toks[@]}]=$tmp
  9350.     done < <( compgen -d -- "$(quote_readline "$cur")" )
  9351.  
  9352.     while read -r tmp; do
  9353.         [[ -n $tmp ]] && toks[${#toks[@]}]=$tmp
  9354.     done < <( eval compgen -f -X $xspec -- "\$(quote_readline "\$cur")" )
  9355.  
  9356.     COMPREPLY=( "${toks[@]}" )
  9357. }
  9358. list=( $( sed -ne '/^# START exclude/,/^# FINISH exclude/p' \
  9359.       $BASH_COMPLETION | \
  9360.     # read exclusion compspecs
  9361.     (
  9362.     while read line
  9363.     do
  9364.         # ignore compspecs that are commented out
  9365.         if [ "${line#\#}" != "$line" ]; then continue; fi
  9366.         line=${line%# START exclude*}
  9367.         line=${line%# FINISH exclude*}
  9368.         line=${line##*\'}
  9369.         list=( "${list[@]}" $line )
  9370.     done
  9371.     echo "${list[@]}"
  9372.     )
  9373.      ) )
  9374. # remove previous compspecs
  9375. if [ ${#list[@]} -gt 0 ]; then
  9376.     eval complete -r ${list[@]}
  9377.     # install new compspecs
  9378.     eval complete -F _filedir_xspec $filenames "${list[@]}"
  9379. fi
  9380. unset list
  9381.  
  9382. # source completion directory definitions
  9383. if [ -d $BASH_COMPLETION_DIR -a -r $BASH_COMPLETION_DIR -a \
  9384.      -x $BASH_COMPLETION_DIR ]; then
  9385.     for i in $BASH_COMPLETION_DIR/*; do
  9386.         [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|.rpm*) ]] &&
  9387.             [ \( -f $i -o -h $i \) -a -r $i ] && . $i
  9388.     done
  9389. fi
  9390. unset i
  9391.  
  9392. # source user completion file
  9393. [ $BASH_COMPLETION != ~/.bash_completion -a -r ~/.bash_completion ] \
  9394.     && . ~/.bash_completion
  9395. unset -f have
  9396. unset UNAME RELEASE default dirnames filenames have nospace bashdefault \
  9397.       plusdirs
  9398.  
  9399. set $BASH_COMPLETION_ORIGINAL_V_VALUE
  9400. unset BASH_COMPLETION_ORIGINAL_V_VALUE
  9401.  
  9402. ###  Local Variables:
  9403. ###  mode: shell-script
  9404. ###  End:
  9405.